839 votes

La compréhension de "l'aléatoire"

Je ne peux pas obtenir ma tête autour de ce qui est plus aléatoire?

rand()

OU

rand() * rand()

Im de trouver qu'il est un véritable casse-tête, pourriez-vous m'aider?

EDIT:

Intuitivement, je sais que la mathématique réponse sera qu'ils sont tout aussi aléatoire, mais je peux pas m'empêcher de penser que si vous exécutez le nombre aléatoire de l'algorithme" à deux reprises lorsque vous multipliez les deux ensemble, vous allez créer quelque chose de plus aléatoire que de le faire juste une fois.

1486voto

belisarius Points 45827

Juste une clarification

Bien que les réponses précédentes sont droit, chaque fois que vous essayez de repérer le caractère aléatoire d'une pseudo-variable aléatoire ou de sa multiplication, vous devez être conscient que lorsque Random() est généralement répartie uniformément, Random() * Random() ne l'est pas.

Exemple

C'est un uniforme de la distribution aléatoire de l'échantillon simulé à l'aide d'une pseudo-variable aléatoire:

Histogram of Random()

        BarChart[BinCounts[RandomReal[{0, 1}, 50000], 0.01]]

Alors que c'est la distribution que vous obtenez après la multiplication de deux variables aléatoires:

Histogram of Random() * Random()

        BarChart[BinCounts[Table[RandomReal[{0, 1}, 50000] * 
                                 RandomReal[{0, 1}, 50000], {50000}], 0.01]]

Oui, les deux sont "aléatoires", mais leur répartition est très différente.

Un autre exemple

Alors que les 2 * Random() est uniformément répartie:

Histogram of 2 * Random()

        BarChart[BinCounts[2 * RandomReal[{0, 1}, 50000], 0.01]]

Random() + Random() ne l'est pas!

Histogram of Random() + Random()

        BarChart[BinCounts[Table[RandomReal[{0, 1}, 50000] + 
                                 RandomReal[{0, 1}, 50000], {50000}], 0.01]]

Le Théorème De La Limite Centrale

Le Théorème de la Limite Centrale stipule que la somme des Random() tend vers une distribution normale comme les termes d'augmentation.

Avec seulement quatre termes, vous bénéficiez de:

Histogram of Random() + Random() + Random() + Random()

BarChart[BinCounts[Table[RandomReal[{0, 1}, 50000] + RandomReal[{0, 1}, 50000] +
                   Table[RandomReal[{0, 1}, 50000] + RandomReal[{0, 1}, 50000],
                   {50000}],
         0.01]]  

Et ici vous pouvez voir la route à partir d'un uniforme à une distribution normale en ajoutant 1, 2, 4, 6, 10 et 20 aléatoire uniformément distribué des variables:

Histogram of different numbers of random variables added

Modifier

Un peu de crédits

Grâce à Thomas Ahle de préciser dans les commentaires que les distributions de probabilité illustré dans les deux dernières images sont connus comme les Irwin-Hall de distribution

Grâce à Heike pour son merveilleux déchiré[] fonction

152voto

Janco Points 1017

ma réponse à tout hasard le nombre de questions est-ce alt text

Donc je suppose que les deux méthodes sont aléatoires bien que mon gutfeel dirais qu' rand() * rand() est moins aléatoire, car il serait de graines de plus de zéros. Dès que l'on s' rand() est 0, le total devient 0

82voto

Matthew Scharley Points 43262

Ce n'est ni 'plus aléatoire.

rand() génère un ensemble prévisible de nombres basés sur une pseudo-aléatoire (généralement basée sur l'heure actuelle, qui est toujours en évolution). La multiplication de deux nombres consécutifs de la séquence génère un de différent, mais tout aussi prévisible, la séquence de nombres.

Examiner si cette mesure permettra de réduire les collisions, la réponse est non. Il sera effectivement augmenter les collisions en raison de l'effet de la multiplication de deux nombres, où 0 < n < 1. Le résultat sera une plus petite fraction, provoquant un biais dans le résultat vers l'extrémité inférieure du spectre.

Quelques explications supplémentaires. Dans la suite, '"imprévisible" et "aléatoire" font référence à la capacité de quelqu'un de deviner ce que le prochain numéro sera basé sur les précédents numéros, c'est à dire. un oracle.

Compte tenu de la graine x qui génère les valeurs suivantes:

0.3, 0.6, 0.2, 0.4, 0.8, 0.1, 0.7, 0.3, ...

rand() va générer la liste ci-dessus, et rand() * rand() permettra:

0.18, 0.08, 0.08, 0.21, ...

Les deux méthodes produisent toujours de la même liste de numéros pour la même semence, et sont donc tout aussi prévisible par un oracle. Mais si vous regardez les résultats pour multiplier les deux appels, vous verrez qu'ils sont tous sous l' 0.3 malgré un décent de distribution dans la séquence d'origine. Les chiffres sont biaisés en raison de l'effet de la multiplication de deux fractions. Le nombre résultant est toujours plus petite, donc beaucoup plus susceptibles d'être d'une collision malgré encore tout aussi imprévisible.

80voto

Alin Purcaru Points 21373

Simplification pour illustrer un point.

Assumer votre fonction aléatoire sorties seulement 0 ou 1.

random() est l'une des (0,1), mais random()*random() est l'une des (0,0,0,1)

Vous pouvez clairement voir que les chances d'obtenir un 0 dans le second cas, ne sont en aucune façon égale à ceux pour obtenir un 1.


Quand j'ai posté cette réponse que je voulais le garder aussi court que possible, de sorte qu'une personne la lecture il va comprendre d'un coup d'œil la différence entre random() et random()*random(), mais je ne peux pas me garder de répondre à l'original ad litteram question:

Ce qui est plus aléatoire?

Étant qu' random(), random()*random(), random()+random(), (random()+1)/2 ou toute autre combinaison qui ne conduit pas à un résultat fixe ont la même source d'entropie (ou le même état initial dans le cas de générateurs pseudo-aléatoires), la réponse serait qu'ils sont tout aussi aléatoire (La différence est dans leur distribution). Un parfait exemple, nous pouvons regarder, c'est le jeu de Craps. Le nombre ainsi obtenu serait random(1,6)+random(1,6) , et nous savons tous que l'obtention de 7 a le plus de chance, mais cela ne signifie pas que le résultat d'un lancer de deux dés est plus ou moins aléatoire que le résultat de roulement.

69voto

valadil Points 849

Voici une réponse simple. Envisager De Monopole. Vous faites deux des six faces de dés (ou 2d6 pour ceux d'entre vous qui préfèrent les jeux de notation) et de prendre leur somme. La conséquence la plus commune est de 7 parce qu'il y a 6 façons possibles, vous pouvez rouler des 7 (1,6 2,5 3,4 4,3 5,2 et 6,1). Considérant que l'un des 2 ne peut être roulé sur 1,1. Il est facile de voir que le matériel de 2d6 est différent de celui de roulement 1d12, même si la plage est la même (en ignorant que vous pouvez obtenir un 1 sur un 1d12, le point reste le même). Multiplier vos résultats au lieu de les ajouter va à l'inclinaison de la même façon, avec la plupart de vos résultats à venir dans le milieu de la gamme. Si vous essayez de réduire les valeurs aberrantes, c'est une bonne méthode, mais il ne sera pas aider à faire une distribution régulière.

(Et curieusement il va augmenter faible rouleaux. En supposant que votre caractère aléatoire commence à 0, vous verrez un pic à 0 parce que ce sera à son tour quel que soit le rouleau est en 0. Considérons deux nombres aléatoires entre 0 et 1 (inclus) et se multiplient. Si le résultat est 0, le tout devient un 0 aucun autre résultat. La seule façon d'obtenir un 1 de il est pour les deux rouleaux à 1. Dans la pratique, ce ne serait probablement pas d'importance, mais il en fait un bizarre graphique).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X