Je suppose que vous voulez un nombre aléatoire dans la gamme [0, 1000000 [qui est dans une plage longueur de 10 . C'est exactement la même chose que de choisir deux nombres aléatoires dans la plage [0, 1000 [, un pour les chiffres d'ordre supérieur (décimal), un pour les plus petits. Mais il est beaucoup plus facile de travailler dans cette plage ...
Si vous voulez une génération aléatoire correcte, vous devez vous soucier de la probabilité de chaque nombre possible et essayer de le garder aussi égal que possible. Donc, vous devez d'abord rechercher la plus grande puissance de 1000 en dessous de RAND_MAX, rejeter tout nombre supérieur à celui-ci et prendre le module 1000 de chaque valeur conservée.
// Find the max number to keep
int period = 1000
unsigned int max = period;
while (max < (unsigned long) RAND_MAX) {
unsigned long t = max * period;
if (t < max) break; // test for a possible overflow
max = t;
}
Vous pouvez ensuite utiliser
for(;;) {
unsigned long randnum = rand();
if (randnum < max) {
randnum %= period;
break;
}
}
Et quand vous avez deux nombres aléatoires dans la gamme [0, 1000 [, disons n1
et n2
, il suffit de faire:
n = period * n1 + n2;
Bien sûr ci-dessus supposons que vous avez une fonction rand
correcte. Si l'utilisation incertain random
-rand
page de manuel sur mon système indique qu'il utilise même algorythme que random
qui est la raison pour laquelle je suppose que je peux l'utiliser en toute sécurité, mais il dit aussi:
implémentations
Cependant, le rand plus(), et implémentations actuelles sur des systèmes différents, les bits d'ordre inférieur sont beaucoup moins aléatoires que les bits d'ordre supérieur.N'utilisez pas cette fonction dans des applications destinées à être portables lorsqu'une bonne répartition aléatoire est nécessaire. (Utilisez random (3) à la place.)
'max' devrait probablement être' long non signé 'aussi, ne devrait pas? – Kundor