/ / Ruby's rand () è abbastanza buono per i giochi di gioco? - rubino, casuale

Ruby's rand () è abbastanza buono per i giochi d'azzardo? - rubino, casuale

Devo generare risultati casuali con le seguenti proprietà:

  • Distribuzione uniforme (cioè i numeri 1-10 sono ugualmente probabili)
  • Imprevedibile (tutti i risultati sono pubblici e, se dataminati, non dovrebbero ancora essere in grado di prevedere i risultati)

L'applicazione riguarda il denaro, quindi è di fondamentale importanza che i risultati rimangano imprevedibili e distribuiti in modo uniforme.

I generatori pseudo casuali regolari si adatterebbero a questo lavoro o avresti bisogno di un rng crittograficamente forte? Il valore predefinito di rand () di Ruby funzionerebbe?

In caso negativo, quali soluzioni suggeriresti?

MODIFICARE: Ruby 2.0.0 Casuale http://www.ruby-doc.org/core-2.0.0/Random.html

risposte:

2 per risposta № 1

Il rand predefinito di Ruby usa l'algoritmo Mersenne Twister Lo stato interno del PRNG, sebbene moderatamente grande, e non semplice hackerare, è in teoria abbastanza piccolo che solo apoche decine di valori da 1 a 10 sarebbero sufficienti per determinare il suo stato, quindi le vostre preoccupazioni non sono infondate. (Aggiornamento: Evidentemente anche lo stato interno "perde" nei valori restituiti, rendendo l'hacking ancora più semplice)

Ti suggerirei di usare SecureRandom, in quanto verrà utilizzato in genere /dev/urandom o la libreria open-ssl come una fonte di casualità. Uno di questi è probabilmente disponibile sul server di destinazione e non sono necessari ulteriori hardware o librerie specialistiche.


Potresti voler andare oltre e esaminare i moduliquella raccolta di entropia da una fonte esterna e quindi mescolarla usando un algoritmo di hashing crittografico (per ottenere una distribuzione uniforme dei valori di bit). La gemma di Ruby RealRand si collega ad alcuni servizi che fanno questo genere di cose. Non sono riuscito a trovare nulla di più moderno in Ruby però.

Se sei preoccupato di affidarti a servizi di terze parti e hai tempo per scrivere il tuo wrapper Ruby, potresti anche dare un'occhiata a un dispositivo USB come questo che funziona dal rumore elettronico.