Online Video Poker (maybe)

zanzibar,

Re:

As I said, I'm not trying to create a problem here because I don't think one exists. Its more an interesting mathematical / theoretical / philosophical discussion. I know I am repeating myself but I want to make it really clear to anyone reading this that I am not trying to harm your businesses.

I have no problem at all with any of your questions. I am sorry if you are inferring such, as that is not at all my intention. I have a high level of confidence in my code (I've been through three audits, the first 2 of which could conservatively be called "grueling"), and I really enjoy the discussion.


As I mentioned above:

The introduction of the init-by-array method, which still uses 32-bit integers but 624 of them, "solves the problem". (To be exact, on this one I do not have quantitative documentation, only the statements published by the Twister's developers when this method was introduced back in 2002, and also by others in the field. But based on this I have proceeded with confidence.)

The only part of the scope of this discussion to which I cannot put a number - exactly what is the result for this init-by-array method? I think it would be logical to conclude that it seeds the Twister to a state greater than 2^32 initialized permutations. However, whether the result is less than, greater than, or equal to 2^225 - I honestly don't know.

(If you have a choice between having a colonoscopy or wading through a Google search on init_by_array, take the colonoscopy.)

As to atom collisions - who knows? Could be? Does anyone really know what goes on in the bowels of CERN? :confused:

But no, sorry to disappoint; there ain't no rocket surgery goin' on at Galewind.

As I understand it, the issue with hardware-related RNGs is the ability to link it to application code. That is, there has to be an API that responds at the microsecond level. And you also need to have a backup (hardware or software?) in the event of failure.

But, to be accurate, I know jack shit about all of that.


Re: your link to the Worsley School article. The one I liked:

"What this means, in practical terms, is that every time you shuffle a deck of 52 cards, you get a new arrangement of the cards that has never been seen by anyone before, and will never occur again!"

Chris
 
Not to my knowledge. PHP's rand() and mt_rand() functions are often cited as being "weak" from a cryptographic security standpoint (eg generating random cryptographic tokens etc). But I don't know how that plays out and its significance to a game of chance.

There's a way to reseed mt_rand in PHP. mt_rand() by itself is relatively weak, since it uses a microtime seed which (and I mean, it's unlikely) could be used to predict outcomes if the player could synchronize his clock with the server somehow, and knew he was the only one getting the hands, and also knew how the server was scaling the numbers to fit the game. But the other downside of using microtime as a seed, which you brought up in talking about possible shuffles, is that the length of the microtime is only zero to a million, which is a major bummer because that's less than 0.5% of the possible seeds you can give to the twister (up to 32 bits, that's 2,147,483,647 initial starting seeds). Nor is there evidence I'm aware of that those first million seeds are representative of the whole. So seeding it that way isn't ideal.

PHP has a function called mt_srand($seed) that lets you reseed the twister with a 32-bit int. That's what we do before each shuffle, with a 32 bit seed that's mixed from previous output of other twisters off the central core. Then taking 52 x decks and shuffling / cutting three times gives us (2^31)^3 possible outcomes, which is about 10^27 possible decks. That's still not as large as the true number of possibilities, but it's pretty good. More importantly, it's a representative sample because it's based on all the possible MT seeds, not just the first million.
 
Also, pretty sure that hardware RNGs work from radio noise. But in most cases they're probably just being used to seed an MT that deals the cards, because they don't spit out numbers fast enough to cover every random call from every game on a server, let alone a global casino. It's a good point that seeding an MT is basically just turning one truly random number into a few million predictable ones, which can be predicted if you get all the first 624 in their pure state. But with 2 billion+ possible seeds, and no one ever seeing sequential numbers from it...forget it. No one can predict that. So the only really important thing in any random shuffle is (1) whatever seeded it can't be predicted, and (2) there's enough possibilities that the chances of it ever repeating itself are low over a decade or two. After that it's kind of like trying to figure out if it's better when they break the shoe into six or break it into three to shuffle at a blackjack table. If they break it into three, you might have a better chance of predicting the shuffle, but it's going to be more based on the last one. As long as it ain't a continuous shoe you're in pretty good shape these days...
 
Just wanted top say thanks to both jstrike and binary for an interesting and informative discussion. If only all operators in this industry were so open and approachable. Best of luck to both of you!
 
The only part of the scope of this discussion to which I cannot put a number - exactly what is the result for this init-by-array method? I think it would be logical to conclude that it seeds the Twister to a state greater than 2^32 initialized permutations. However, whether the result is less than, greater than, or equal to 2^225 - I honestly don't know.

zanzibar,

Since my answer to your last question was "I don't know", this is a loose end, and I hate loose ends.

Faced with the possibility of another coma-inducing Google search, a smack to the forehead revealed a third option (after the colonoscopy) - ask iTech Labs. Which I did. Their answer:

... since the array based seeding method initializes up to 623 Integer variables of the state vector (the first value of the array is always set to a fixed non-zero value in order to avoid an initialization with all zeroes), the initial state can have of 2^(623*32) = 2^19936 distinct values. Initialization by an array is considered the superior way of seeding an MT ...

So - wow. My previous conclusion, based on speculation, proved correct. init_by_array more than satisfies the shuffle permutations of a 52-card deck at ~= 2^225. (It more than satisfies the shuffle permutations of a 6-deck (312-card) shoe at ~- 2^2150.)

Given the magnitude of the numbers we are throwing around, I was surprised.

Anyway, loose end snipped.

Chris
 
Fascinating Screenshots.

Screenshots! This is what it looks like typically. What you see are the shoes as they were initially shuffled (you can see which are single-deck and which are 6-deck). Then on the back-end we can see how each hand was played. On a side note, the only decks we don't publish are the ones from regular poker games like Hold'em ...obviously, to maintain players privacy. When we get a request for hand histories, we run them through a program that shows the history of the hand as it was seen from the perspective of the player who made the request, so they can only see their own cards in the history, and other players cards that were actually exposed.

View attachment 29418View attachment 29419View attachment 29420

Us non-industry players never get to see that kind of stuff. I think most of the legitimate Online Gaming sites out there do not rig their games. As Nifty29 says, they don't have too. All they have to do is set the payback percentage on the slots and the payoff tables for the VP games and if they treat their customers just above average and have the money to back their business they should be rolling in the dough! :thumbsup:
 

Users who are viewing this thread

Meister Ratings

Back
Top