Question

Chaque fois que j'utilise la fonction rand en C ++:

#include<iostream>
#include<time.h>
#include<stdlib.h>
using namespace std;
int main(){
srand(time(0));
int n=(rand()%6)+1;
cout<<"The dice roll is "<<n<<"."<<endl;
}

Je reçois un avertissement concernant la conversion de time_t en int à la ligne 5:

srand(time(0));

Y a-t-il un moyen de se débarrasser de cet avertissement?

Était-ce utile?

La solution

En fait, vous devriez utiliser un unsigned avec srand () :

srand((unsigned) time(0));

Autres conseils

Sur une note différente, ce code:

rand()%6

est généralement considéré comme une mauvaise pratique. les bits inférieurs de rand () sont nettement moins aléatoires que les bits supérieurs. Vous obtiendrez un meilleur caractère aléatoire si vous le faites:

(rand() >> 8)%6

par exemple.

EDIT:

Pour plus de détails à ce sujet, voir cette note et également cet article. de Dr. Dobbs journal qui suggère au moins la raison:

  

Remarque: n'utilisez PAS

  y = rand()  %  M;
     

comme cela se concentre sur les bits inférieurs de   rand(). Pour linéaire congruentielle aléatoire   générateurs de nombres, qui rand () souvent   est, les octets inférieurs sont beaucoup moins   aléatoire que les octets les plus élevés. En réalité   le bit le plus bas alterne entre 0 et 1.   Ainsi, rand () peut faire un cycle entre pair et   étrange (essayez-le). Remarque rand () ne le fait pas   doivent être un congruentiel linéaire   générateur de nombres aléatoires. Ses   parfaitement admissible pour qu'il soit   quelque chose de mieux qui n'a pas   ce problème.

DDJ:

  

Le point le plus important est que le   bits inférieurs de la sortie du   usuel (linéaire congruentielle) aléatoire   les générateurs de nombres sont les moins   " random. " C’est-à-dire des modèles dans le   les bits inférieurs sont communs. D'où le   sortie de la routine rouler dans votre   la discussion n'est pas surprenante. Aussi   est évitable en s’appuyant sur la partie supérieure   bits pour déterminer l'entier   retourné.

Par exemple, si vous voulez choisir un " vrai " aléatoire; ou " faux " valeur, et vous avez utilisé le code:

rand() % 2

Ensuite, vous risquez de voir apparaître le modèle de résultats:

1,0,1,0,1,0,1,0,1,0 (etc)

Ce n’est évidemment pas si aléatoire, mais c’est une propriété du générateur de congruence linéaire qui pourrait être utilisée. Un meilleur schéma (pour le C ++) pourrait être d’utiliser le Boost Bibliothèque .Random qui prend en charge toutes sortes de générateurs aléatoires enfichables (y compris Mersenne Twister qui n’a pas cette faille).

Utilisez une distribution explicite pour vous débarrasser de l'avertissement:

srand((int)time(0));

Deux notes latérales:

  • La méthode standard pour inclure les en-têtes C dans C ++ est la suivante: #include <cstdio>.
  • Le paramètre passé à time() est un pointeur. De nombreuses personnes pensent que NULL est un pointeur null plus lisible que 0.

Pour vous débarrasser de cet avertissement, vous devez utiliser une conversion statique en un entier non signé.

srand(static_cast<unsigned int>(time(0)));

Sur une note connexe, les résultats de rand doivent être décalés vers la droite pour éliminer tout biais dans les bits inférieurs.

int n = ((rand() >> 8) % 6) + 1;

Enfin, en C ++, les bibliothèques C Time et standard doivent être incluses en tant que:

#include <ctime>
#include <cstdlib>

Ceci placera les fonctions dans l'espace de noms approprié, 'std'.

En outre,

 rand() % 6

introduira un petit biais. Dans la mesure où RAND_MAX% 6 est égal à 1, zéro et un apparaissent légèrement plus souvent que deux à six. Dans ce cas, ils vous seront retournés 5462 fois pour chaque 5461 fois les numéros les plus élevés sont retournés, de sorte que vous ne le remarquerez probablement pas. Toutefois, si la plage de chiffres que vous souhaitez est large, le biais peut être important. Par exemple, si vous le faites rand() % 32000, un nombre compris entre 0 et 767 s'affichera deux fois plus souvent que les numéros 768 - 32000.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top