I would modify your design a bit so you can leverage the data as well prevent logic mistakes that may ruin your stats.
First I would store up and down votes as two separate meta values. The reason is that you can then display both if you desire, as well as calculate votes as a percentage of the whole. For example 45 up, 10 down, or 81% favor this question, and 55 people have voted. You can then show those stats to the users. How you do it now can only show a net positive gain which gives no context to actual popularity, i.e +3 is not that useful.
Logic mistake prevention: If your code does +1 or -1 and your code has bad logic then all your votes will be wrong potentially. It is easier to simply store the votes as the user intended and then use retrieval/read techniques to then do your logic. i.e to keep data integrity you never want to write destructive logic. It is easier to fix a read error 45up/55total than to modify "vote" by a set of writes. How can you fix data that you have overwritten is my point.
A cookie is good to prevent several requests in a session but the best way to track a user with or without a cookie would be to use ajax and after they try voting on a question lookup the users vote for the current question (assuming no cookie was set or it expired). By doing this you could also allow them to change their vote. This would mean you would need to do one of two things that I think could be easy:
Have a logging table of how a user voted that tracks their username/user_id, the question number, and their vote. This would be a standard non wordpress way in pure mysql systems but might also make sense for you here. The other option might be to serialize a users votes across all questions answered and store as one object. Now since your info is brief about your system its hard to give a definitive answer to whats best; whether to use another table or serialize a meta field in the meta table. This should give you some ideas.