2010-01-08 5 views
2

Quel est le moyen le plus rapide de générer aléatoirement des nombres, soit aléatoirement, soit en simulant un aléa? Je n'ai pas vraiment besoin d'un vrai générateur de nombres aléatoires, il serait acceptable de simuler au hasard. J'ai essayé d'autres méthodes de simulation aléatoires, mais aucune n'était plus rapide que celle-ci.Quel est le moyen le plus rapide de générer des nombres de façon aléatoire dans Visual Basic 2008?

Voici le moyen le plus rapide que j'ai maintenant:

Private myRandom As New System.Random(CType(System.DateTime.Now.Ticks Mod System.Int32.MaxValue, Integer)) 
Private sub Test1 
    Dim F as integer = myRandom(0, 203) 
End Sub 
+3

Quel est le problème avec la classe 'Random'? Au fait, vous n'avez pas besoin de le semer vous-même; il utilisera 'Environment.TickCount' comme graine par défaut. – SLaks

+1

Référence xkcd obligatoire: 'int random() {return 4; } // choisi par un jet de dés juste. –

+0

+1 Jon pour avoir souligné qu'il y a un compromis entre la qualité et la vitesse –

Répondre

3

Le moyen le plus rapide, je peux penser à obtenir des nombres aléatoires est de générer un grand tableau de nombres aléatoires à l'avance que vous défiler à plusieurs reprises. Cela pourrait également donner des résultats de très mauvaise qualité à moins que la taille de la matrice soit énorme. La qualité serait également affectée par la façon dont vous générez les nombres.

2

Avez-vous besoin vraiment la méthode la plus rapide? Quelles sont les contraintes minimales sur les qualités de celui-ci?

Je soupçonne que le générateur de nombres aléatoires intégré, aléatoire, mais pas nécessairement le plus rapide, a un compromis raisonnable entre «normes minimales» et la vitesse. Si ce n'est pas le cas, voici quelques informations sur d'autres générateurs de nombres aléatoires, dont certains peuvent être plus rapides, certains pouvant être plus mauvais. Il y aura un compromis entre la qualité et la vitesse, donc je doute que vous vouliez le plus rapide.

http://www.google.ca/search?source=ig&hl=en&rlz=1R2ADSA_enCA338&q=FAST+pseudo+random+number+generator&meta=lr%3D&aq=f&oq=

`

1

Voici trois façons de le faire, par ordre de vitesse (19 ms pour un million d'itérations, dans mon test):

dim rand as new random(0) 

i = rand.next 

Un peu plus lent est un appel à la fonction xkcd (24 ms) :

function random as integer 
random = 4 ' chosen by fair dice roll 
end function 

Et un peu plus lente encore est la fonction point de VB flottant (67 ms):

x = rnd(x) 

Chacun de ces i s plus rapide que de prendre les derniers bits de l'horloge système. La surcharge de la fonction semble être suffisante pour justifier l'utilisation des fonctions aléatoires intégrées. Par exemple, si vous générez un nombre aléatoire à virgule flottante en utilisant presque n'importe quel algorithme, il finira par être plus lent que la fonction rnd vb. Idem pour entier et la classe aléatoire.

Questions connexes