/ / Je rand () Ruby dostatočne dobrý na hranie hazardných hier? - rubínový, náhodný

Je Ruby's rand () dostatočne dobrý na hranie hazardných hier? - rubín, náhodný

Potrebujem generovať náhodné výsledky s nasledujúcimi vlastnosťami:

  • Jednotná distribúcia (tj čísla 1 až 10 sú rovnako pravdepodobné)
  • Nepredvídateľné (všetky výsledky sú verejné a ak sú datamované, nemali by byť schopné predpovedať výsledky)

Aplikácia sa zaoberá peniazmi, takže je kriticky dôležité, aby výsledky zostali nepredvídateľné a boli jednotne rozdelené.

Plánovali by ste pravidelné pseudonáhodné generátory, alebo by ste potrebovali kryptograficky silnú rng? Bolo by štandardné rand () práce Ruby? Čo by ste mali dávať pozor?

Ak nie, aké riešenia by ste navrhli?

EDIT: Ruby 2.0.0 Náhodný http://www.ruby-doc.org/core-2.0.0/Random.html

odpovede:

2 pre odpoveď č. 1

Ruby štandardný rand používa Mersenne Twister algoritmus. Vnútorný stav PRNG, aj keď mierne veľký, a nie prostý na hack, je teoreticky dostatočne malý, že lenniekoľko desiatok hodnôt od 1 do 10 stačí na určenie jeho stavu, takže vaše obavy nie sú neopodstatnené. (Aktualizácia: Zrejme aj vnútorný stav "uniká" do vrátených hodnôt, čím sa ešte viac uľahčuje hackovanie)

Navrhoval by som vám použiť SecureRandom, pretože to zvyčajne použije /dev/urandom alebo open-ssl knižnicu ako surový zdroj náhodnosti. Jeden z nich je pravdepodobne dostupný na vašom cieľovom serveri a nie je potrebný žiadny dodatočný hardvér alebo špecializované knižnice.


Možno budete chcieť ísť ďalej a pozrieť sa do modulovže entropia zberu z vonkajšieho zdroja a potom sa zmieša pomocou algoritmu kryptografického hashovania (aby sa získala rovnomerná distribúcia bitových hodnôt). Ruby klenot RealRand prepája sa na niektoré služby, ktoré robia takéto veci. Nenašiel som v Ruby nič modernejší.

Ak máte záujem o dôveru v služby tretích strán a máte čas na napísanie vlastného obalu na Ruby, môžete sa tiež pozrieť na zariadenie USB ako je tento ktorý funguje z elektronického šumu.