146 votes

Pourquoi est-ce que C++ rand() semblent générer uniquement des chiffres du même ordre de grandeur?

Dans une petite application écrite en C/C++, je suis confronté à un problème avec l' rand de la fonction et peut-être de la graine :

Je veux produire une séquence de nombres aléatoires qui sont de différents ordres, c'est à dire avec les différents logarithme des valeurs (base 2). Mais il semble que tous les nombres obtenus sont du même ordre, fluctuant entre 2^25 et 2^30.

Est-ce parce qu' rand() est ensemencé avec le temps Unix qui est maintenant un relativement grand nombre? Que suis-je oublier ? Je suis d'ensemencement rand() qu'une seule fois au début de l' main().

478voto

C4stor Points 2675

Il y a seulement 3% de nombres entre 1 et 230 qui ne sont PAS entre 225 et 230. Donc, cela semble assez normal :)

Parce que 225 / 230 = 2-5 = 1/32 = 0.03125 = 3.125%

272voto

Casey Chu Points 8804

Le vert pâle est la région comprise entre 0 et 2,25; le plus sombre, le vert est la région entre 225 et 230. Les tiques sont des puissances de 2.

distribution

42voto

Bathsheba Points 23209

Vous avez besoin pour être plus précis: vous souhaitez que les différents logarithme en base 2 valeurs, mais que la distribution voulez-vous pour cela? La norme rand() les fonctions de générer une distribution uniforme, vous aurez besoin de transformer cette sortie à l'aide de la fonction quantile de la fonction associée à la distribution que vous voulez.

Si vous nous dites la distribution, alors nous pouvons vous dire le quantile de la fonction dont vous avez besoin.

18voto

aspiring_sarge Points 466

Si vous souhaitez que les différents ordres de grandeur, pourquoi ne pas tout simplement essayer de pow(2, rand())? Ou peut-être choisir l'ordre directement rand(), comme Harold suggéré?

13voto

@C4stor fait un grand point. Mais, pour un cas plus général et plus facile à comprendre pour l'homme (base 10): pour la gamme de 1 à 10^n, ~90% des effectifs sont à partir de 10^(n-1) à 10^n, par conséquent, ~99% des nombres de 10^(n-2) à 10^n. Continuez d'ajouter autant de décimales que vous souhaitez.

Drôle de mathématiques, si vous continuez à faire cela pour n, vous pouvez voir que de 1 à 10^n, 99.9999...% = 100% du chiffres sont à partir de 10^0 à 10^n avec cette méthode.

Maintenant sur le code, si vous voulez un nombre aléatoire aléatoire ordres de grandeur, de 0 à 10^n, vous pouvez faire:

  1. Générer un petit nombre aléatoire de 0 à n

  2. Si vous connaissez la plage qui n a, de générer un grand nombre aléatoire de l'ordre de 10^k, où k > max{n}.

  3. Couper le plus de nombre aléatoire pour obtenir les n chiffres de ce grand nombre au hasard.

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