web-dev-qa-db-fra.com

Véritable génération aléatoire en Java

Je lisais le javadoc Math.random () et ai vu que le hasard est seulement psuedorandom. 

Existe-t-il une bibliothèque (en particulier Java) qui génère des nombres aléatoires en fonction de variables aléatoires telles que la température ambiante, la température/la tension du processeur, etc.?

23
Gareth

Découvrez http://random.org/

RANDOM.ORG est un véritable service de nombres aléatoires qui génère un caractère aléatoire via le bruit atmosphérique.

La bibliothèque Java pour l’interface avec elle peut être trouvée ici: http://sourceforge.net/projects/trng-random-org/

27
Greg Dean

Votre question est ambiguë, ce qui fait que les réponses sont partout. 

Si vous recherchez une implémentation aléatoire qui s'appuie sur la source d'aléa du système (comme je suppose que vous l'êtes), javax.crypto.SecureRandom le fait. La configuration par défaut du fournisseur de sécurité Sun dans votre fichier Java.security est la suivante:

#
# Select the source of seed data for SecureRandom. By default an
# attempt is made to use the entropy gathering device specified by
# the securerandom.source property. If an exception occurs when
# accessing the URL then the traditional system/thread activity
# algorithm is used.
#
# On Solaris and Linux systems, if file:/dev/urandom is specified and it
# exists, a special SecureRandom implementation is activated by default.
# This "NativePRNG" reads random bytes directly from /dev/urandom.
#
# On Windows systems, the URLs file:/dev/random and file:/dev/urandom
# enables use of the Microsoft CryptoAPI seed functionality.
#
securerandom.source=file:/dev/urandom

Si vous demandez vraiment de remplacer cette valeur par quelque chose d'encore plus aléatoire, vous pouvez le faire en modifiant cette propriété ou en utilisant un autre SecureRandom. Par exemple, vous pouvez utiliser un fournisseur JCE supporté par un module HSM tel que nCipher nShield qui a son propre PRNG ou d'autres solutions mentionnées dans la discussion.

21
ykaganovich

Étant donné que l'exploitation de ces sources de données aléatoires nécessiterait un accès matériel, une telle bibliothèque ne peut pas être écrite de manière portable en Java pur.

Vous pouvez toutefois essayer d'écrire du code dépendant de la plate-forme pour lire la source de données aléatoires de la plate-forme. Pour Linux (et éventuellement d'autres systèmes de type Unix également), il pourrait s'agir de /dev/random par exemple.

Regardez aussi la classe SecureRandom , elle contient peut-être déjà ce que vous voulez.

8
Joachim Sauer

Rapide et sale:

public static int generateRandom() throws IOException
{
    int num = 0;
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    for (int i = 0 ; i < Integer.SIZE ; i++)
    {
        System.out
          .println("Flip a fair coin. Enter h for heads, anything else for tails.");

        if (br.readLine().charAt(0) == 'h')
        {
            num += Math.pow(2, i);
        }
    }

    return num;
}
7
Adam Jaskiewicz

Assurez-vous que vous voulez vraiment de "vrais" nombres aléatoires. Les sources physiques de caractère aléatoire doivent être mesurées et le processus de mesure introduit certains biais. Pour certaines applications, les nombres "pseudo" aléatoires sont préférables aux "vrais" nombres aléatoires. Ils peuvent avoir de meilleures propriétés statistiques et vous pouvez les générer plus rapidement. D'autre part, vous pouvez vous tirer une balle dans le pied avec des générateurs de nombres pseudo-aléatoires si vous ne faites pas attention.

6
John D. Cook

L'architecture cryptographique J ava requiert des nombres aléatoires puissants sur le plan cryptographique. Il contient le SecureRandom class mentionné par @saua.

4
tvanfosson

Juste pour clarifier: le seul générateur TRUE existant dans l’univers est Générateur de bits aléatoires quantiques . Il n'y a pas d'autre mécanisme qui puisse vous assurer que les bits générés sont totalement aléatoires, car même si vous ne pouvez pas prédire le résultat, rien ne garantit que vous ne pourrez pas le faire à l'avenir. 

Générateur de bits aléatoires quantiques '(QRBG121), qui est un générateur de bits aléatoires rapides Non déterministes dont le caractère aléatoire Repose sur le caractère aléatoire intrinsèque du processus physique quantique de Photonique émission dans les semi-conducteurs et détection ultérieure par effet photoélectrique . Dans ce processus, les photons sont détectés au hasard, Les uns après les autres, indépendamment les uns des autres. Les informations de synchronisation des photons Détectés sont utilisées pour générer des chiffres binaires aléatoires - bits. La particularité De cette méthode est qu’elle utilise un seul détecteur de photons pour Produire à la fois des zéros et des zéros, ce qui entraîne un très faible biais et une Immunité élevée aux variations et au vieillissement des composants. . En outre, La détection de photons individuels est effectuée par un photomultiplicateur (PMT). Par rapport aux détecteurs à photons à l'état solide, les PMT ont considérablement Des performances de signal sur bruit supérieures et une probabilité bien moindre de d'apparition de postpulsions qui pourraient être une source de corrélations non désirées.

Plus d'informations par exemple ici: http://random.irb.hr/

3
Marek

Il n'y a pas de générateur de nombres aléatoires true , car ils reposent tous, d'une manière ou d'une autre, sur des procédures déterministes pour calculer un nombre aléatoire. Ainsi, quelle que soit la manière dont les nombres générés semblent suivre une vraie distribution aléatoire, ils peuvent en faire partie. Pseudo-Aléatoire . Cependant, vous pouvez implémenter votre propre générateur de nombres aléatoires, il existe deux méthodes agréables, peu coûteuses en calcul, que vous pouvez utiliser lire dans Recettes numériques en C, Deuxième édition - Section 7 . HTH

3
Josef

Citation de Wikipedia: John von Neumann a déclaré: "Quiconque utilise des méthodes arithmétiques pour produire des nombres aléatoires est en état de péché." 

2
tuinstoel

Dans la plupart des cas, les nombres pseudo-aléatoires sont plus que suffisants. Si vous avez juste besoin d'un nombre aléatoire simple, c'est-à-dire. Dans 30% des cas, il vous faut un horodatage en tant que graine. Si cela doit être un nombre aléatoire sécurisé, par exemple en mélangeant un jeu, vous voulez choisir votre graine un peu plus soigneusement, il existe de bonnes sources pour créer des semences sécurisées. 

La raison d'utiliser des graines est de pouvoir "rappeler" la même séquence de nombres aléatoires générés par l'algorithme. Un très bon scénario pour cela est que lorsque vous effectuez une simulation stochastique et que vous souhaitez répéter une expérience particulière, vous utilisez simplement le même germe. 

Pour un meilleur PRNG que celui fourni avec Java, consultez le Mersenne Twister .

2
Guðmundur Bjarni

Au collège, je devais mettre en œuvre un générateur aléatoire. J'ai créé un générateur de nombre aléatoire comme ceci: créé une fenêtre de bureau et demandé à un utilisateur de cliquer sur des emplacements aléatoires de la fenêtre, après chaque clic, j'ai pris les coordonnées du point cliqué. C'était assez aléatoire je pense. 

1
Serik

Voir aussi cette SO question: Sources d'entropie alternatives

J'ai trouvé HotBits il y a plusieurs années - les nombres sont générés à partir de décroissance radioactive, des nombres véritablement aléatoires.

Il existe une bibliothèque Java pour accéder à randomx

Il y a des limites au nombre de numéros que vous pouvez télécharger par jour, mais cela m’amuse toujours de les utiliser comme des graines vraiment, vraiment aléatoires pour RNG.

1
Ken Gentle

Autant que je sache, ils travaillent avec time de la machine ...!

Pour quels nombres aléatoires sont utilisés

Des nombres aléatoires sont utilisés depuis des milliers d'années. Qu'il s'agisse de lancer une pièce ou de lancer un dé, l'objectif est de laisser le résultat final Au hasard. Les générateurs de nombres aléatoires dans un ordinateur sont similaires - ils constituent une tentative d’obtenir un résultat aléatoire Imprévisible.

Est-ce possible de faire de vrais nombres aléatoires?

Oui, ça l'est !

Pour générer un «vrai» nombre aléatoire, l'ordinateur mesure un certain type de phénomène physique qui se produit en dehors de l'ordinateur.

Pour un exemple plus quotidien, l'ordinateur pourrait utiliser le bruit atmosphérique Ou simplement utiliser l'heure exacte à laquelle vous appuyez sur les touches de votre clavier pour Une source de données imprévisibles, ou d'entropie. Par exemple, votre ordinateur Peut remarquer que vous avez appuyé sur une touche exactement 0.23423523 seconde Après 14 h 00. Prenez suffisamment de temps spécifiques associés à ces pressions sur la touche Et vous obtiendrez avoir une source d'entropie que vous pouvez utiliser pour générer un «vrai» nombre aléatoire.

Le NSA et le générateur de nombres aléatoires de matériel d’Intel

Pour faciliter la tâche des développeurs et contribuer à la création de nombres aléatoires Sécurisés, les puces Intel incluent un générateur de nombre aléatoire basé sur du matériel , Appelé RdRand. Cette puce utilise une source d'entropie sur le processeur et Fournit au logiciel des nombres aléatoires à la demande du logiciel.

source: HowToGeek?

Juste au cas où vous auriez besoin de générer des nombres aléatoires dans Android ... J'utilise Data of Accelerometer pour de vrais nombres aléatoires basés sur la physique :)

0
Disco4uf