web-dev-qa-db-fra.com

rand () renvoie le même nombre à chaque exécution du programme

Dans cet extrait de code C++ plutôt basique impliquant la génération de nombres aléatoires:

include <iostream>
using namespace std;

int main() {
    cout << (Rand() % 100);
    return 0;
}

Pourquoi ai-je toujours une sortie de 41? J'essaie de le faire sortir un certain nombre aléatoire entre 0 et 100. Peut-être que je ne comprends pas quelque chose sur le fonctionnement de la fonction Rand?

23
codedude

Vous devez "semer" le générateur. Regardez cette courte vidéo, cela clarifiera les choses.

https://www.thenewboston.com/videos.php?cat=16&video=175

13
Aaron

Vous devez changer le graine .

int main() {

    srand(time(NULL));
    cout << (Rand() % 101);
    return 0;
}

la chose srand seeding est également valable pour un code de langue c.


Voir aussi: http://xkcd.com/221/

34
0x90

Pour ce que ça vaut, vous ne générez également que des nombres entre 0 et 99 (inclus). Si vous vouliez générer des valeurs entre 0 et 100, vous en auriez besoin.

Rand() % 101

en plus d'appeler srand () comme mentionné par d'autres.

10
DuncanACoulter

Vous ne semez pas le nombre.

Utilisez ceci:

#include <iostream>
#include <ctime>

using namespace std;

int main()
{
    srand(static_cast<unsigned int>(time(0)));
    cout << (Rand() % 100) << endl;
    return 0;
}

Cependant, vous ne devez le semer qu'une seule fois. Fondamentalement, ne semez pas tous les nombres aléatoires.

6
user1870398

srand() amorce le générateur de nombres aléatoires. Sans graine, le générateur est incapable de générer les nombres que vous recherchez. Tant que le besoin de nombres aléatoires n'est pas critique pour la sécurité (par exemple, toute sorte de cryptographie), la pratique courante consiste à utiliser l'heure système comme graine en utilisant la fonction time() à partir du <ctime> bibliothèque en tant que telle: srand(time(0)). Cela amorcera le générateur de nombres aléatoires avec l'heure système exprimée sous forme d'horodatage Unix (c'est-à-dire le nombre de secondes depuis la date du 1/1/1970). Vous pouvez ensuite utiliser Rand() pour générer un nombre pseudo-aléatoire.

Voici une citation d'un question en double :

La raison en est qu'un nombre aléatoire généré à partir de la fonction Rand () n'est pas réellement aléatoire. C'est simplement une transformation. Wikipedia donne une meilleure explication de la signification du générateur de nombres pseudo-aléatoires: générateur de bits aléatoires déterministes. Chaque fois que vous appelez Rand (), il prend la graine et/ou le ou les derniers nombres aléatoires générés (la norme C ne spécifie pas l'algorithme utilisé, bien que C++ 11 ait des fonctionnalités pour spécifier certains algorithmes populaires), exécute un opération mathématique sur ces nombres, et renvoie le résultat. Donc, si l'état initial est le même à chaque fois (comme c'est le cas si vous n'appelez pas srand avec un nombre vraiment aléatoire), vous obtiendrez toujours les mêmes nombres `` aléatoires ''.

Si vous voulez en savoir plus, vous pouvez lire ce qui suit:

http://www.dreamincode.net/forums/topic/24225-random-number-generation-102/

http://www.dreamincode.net/forums/topic/29294-making-pseudo-random-number-generators-more-random/

6
user1655874

fonctions aléatoires comme borland complier

using namespace std;

int sys_random(int min, int max) {
   return (Rand() % (max - min+1) + min);
}

void sys_randomize() {
    srand(time(0));
}
4
Alexey Ryabinin