il y a t'il une fonction de la STL ( ou STD) qui renvoi un nbre alléatoire ( comme random de stdlib.h)
15 réponses
heinquoi
Bonjour,
je cherche a faire un tableau de nombres alléatoires. Et je n'ai pas trouvé
de fonction en c++ dans la std.
je me suis alors retourné vers le random de stdlib.h et je pensait rajouté
cstdlib a mon prjet. Mais random ne fait plus partie de stdlib.h
j'ai besoin d'une fonction qui retourne un nombre alléatoire entre 0 et un
maximum que je fournis.
vector<int> v;
for (int n=0; n<25 ; n++) v.insert(v.begin(), random (8 sqrt
(sizeof(int))));
une idée ?
H
"heinquoi" <nospam* a écrit dans le message de news:40c4a8ec$0$12747$
vector<int> v; for (int n=0; n<25 ; n++) v.insert(v.begin(), random (8 sqrt (sizeof(int))));
je me suis planté c'est random (2sqrt (8*sizeof(int)) our avoir un chiffre sur tout l'intervalle d'un entier.
une idée ? H
Alexandre
bonjour,
je cherche a faire un tableau de nombres alléatoires. Et je n'ai pas trouvé
de fonction en c++ dans la std.
Je crois qu'il n'y en a pas.
je me suis alors retourné vers le random de stdlib.h et je pensait rajouté cstdlib a mon prjet. Mais random ne fait plus partie de stdlib.h
Si, uniquement sous Win32 et certains compilateurs. Mais ce n'est qu'une macro. La fonction rand() , elle, est bien présente dans stdlib. Elle fournit un nombre entre 0 et RAND_MAX (constante définie dans stdlib).
Exemple pour obtenir un nombre entre 0 et Nmax (si Nmax < RAND_MAX) :
rand() % Nmax ;
bonjour,
je cherche a faire un tableau de nombres alléatoires. Et je n'ai pas
trouvé
de fonction en c++ dans la std.
Je crois qu'il n'y en a pas.
je me suis alors retourné vers le random de stdlib.h et je pensait rajouté
cstdlib a mon prjet. Mais random ne fait plus partie de stdlib.h
Si, uniquement sous Win32 et certains compilateurs. Mais ce n'est qu'une
macro. La fonction rand() , elle, est bien présente dans stdlib. Elle
fournit un nombre entre 0 et RAND_MAX (constante définie dans stdlib).
Exemple pour obtenir un nombre entre 0 et Nmax (si Nmax < RAND_MAX) :
je cherche a faire un tableau de nombres alléatoires. Et je n'ai pas trouvé
de fonction en c++ dans la std.
Je crois qu'il n'y en a pas.
je me suis alors retourné vers le random de stdlib.h et je pensait rajouté cstdlib a mon prjet. Mais random ne fait plus partie de stdlib.h
Si, uniquement sous Win32 et certains compilateurs. Mais ce n'est qu'une macro. La fonction rand() , elle, est bien présente dans stdlib. Elle fournit un nombre entre 0 et RAND_MAX (constante définie dans stdlib).
Exemple pour obtenir un nombre entre 0 et Nmax (si Nmax < RAND_MAX) :
rand() % Nmax ;
Loïc Joly
Alexandre wrote:
Exemple pour obtenir un nombre entre 0 et Nmax (si Nmax < RAND_MAX) :
rand() % Nmax ;
A noter que même si rand() est de bonne qualité (ce qui est loin d'être le cas sur beaucoup de compilateurs), cette façon de faire introduit un biais.
Voici un bout de doc détaillant ça :
7.3.3 L'approche par modulo Nous savons tout que le reste de la division d'un nombre par N est compris entre 0 et N-1 au sens large. Une approche naïve consisterait donc à écrire :
int lancerUnDe ( int nombreDeFaces ) { return ( rand () % nombreDeFaces )+1; }
Cette approche est pernicieuse car elle donne l'impression de bien marcher, pourtant elle introduit un biais qui a tendance à favoriser les petits jets de dés. Prenons pour illustrer la valeur 10 pour RAND_MAX, et lançons un dé à 4 faces. Supposons que la fonction rand est parfaite, c'est à dire qu'elle a autant de chance de renvoyer n'importe quelle valeur entre 0 et 10. Les résultats possibles sont indiqués tab. 7.1 page suivante
Tab. 7.1 Biais introduit par un modulo sur les résultats de rand Valeur de rand 0 1 2 3 4 5 6 7 8 9 10 Résultats du modulo 0 1 2 3 0 1 2 3 0 1 2 On peut voir sur cet exemple que la probabilité d'obtenir un 0, un 1 ou un 2 est de 3/11 alors que celle d'obtenir un 3 n'est que de 2/11 . Ce biais pour les faible valeurs devient peu important à partir du moment où RAND_MAX est très grand par rapport à nombreDeFaces. Il est néanmoins possible de le supprimer complètement. L'idée est sur l'exemple précédant de commencer par rejeter les résultats 8, 9 et 10 pour rand avant que de calculer le modulo.
/** * Cette fonction lance un dé à nombreDeFaces faces et retourne * sa valeur . Elle suppose que srand a été appelé auparavant . */ int lancerUnDe1 ( int nombreDeFaces ) { int const seuil = RAND_MAX - ( RAND_MAX % nombreDeFaces ); int valeurBrute = rand (); while ( valeurBrute >= seuil ) { valeurBrute = rand (); } return ( valeurBrute % nombreDeFaces )+1; }
-- Loïc
Alexandre wrote:
Exemple pour obtenir un nombre entre 0 et Nmax (si Nmax < RAND_MAX) :
rand() % Nmax ;
A noter que même si rand() est de bonne qualité (ce qui est loin d'être
le cas sur beaucoup de compilateurs), cette façon de faire introduit un
biais.
Voici un bout de doc détaillant ça :
7.3.3 L'approche par modulo
Nous savons tout que le reste de la division d'un nombre par N est
compris entre 0 et N-1 au sens large. Une approche naïve consisterait
donc à écrire :
int lancerUnDe ( int nombreDeFaces )
{
return ( rand () % nombreDeFaces )+1;
}
Cette approche est pernicieuse car elle donne l'impression de bien
marcher, pourtant elle introduit un biais qui a tendance à favoriser les
petits jets de dés. Prenons pour illustrer la valeur 10 pour RAND_MAX,
et lançons un dé à 4 faces. Supposons que la fonction rand est parfaite,
c'est à dire qu'elle a autant de chance de renvoyer n'importe quelle
valeur entre 0 et 10. Les résultats possibles sont indiqués tab. 7.1
page suivante
Tab. 7.1 Biais introduit par un modulo sur les résultats de rand
Valeur de rand 0 1 2 3 4 5 6 7 8 9 10
Résultats du modulo 0 1 2 3 0 1 2 3 0 1 2
On peut voir sur cet exemple que la probabilité d'obtenir un 0, un 1 ou
un 2 est de 3/11 alors que celle d'obtenir un 3 n'est que de 2/11 . Ce
biais pour les faible valeurs devient peu important à partir du moment
où RAND_MAX est très grand par rapport à nombreDeFaces. Il est néanmoins
possible de le supprimer complètement. L'idée est sur l'exemple
précédant de commencer par rejeter les résultats 8, 9 et 10 pour rand
avant que de calculer le modulo.
/**
* Cette fonction lance un dé à nombreDeFaces faces et retourne
* sa valeur . Elle suppose que srand a été appelé auparavant .
*/
int lancerUnDe1 ( int nombreDeFaces )
{
int const seuil = RAND_MAX - ( RAND_MAX % nombreDeFaces );
int valeurBrute = rand ();
while ( valeurBrute >= seuil )
{
valeurBrute = rand ();
}
return ( valeurBrute % nombreDeFaces )+1;
}
Exemple pour obtenir un nombre entre 0 et Nmax (si Nmax < RAND_MAX) :
rand() % Nmax ;
A noter que même si rand() est de bonne qualité (ce qui est loin d'être le cas sur beaucoup de compilateurs), cette façon de faire introduit un biais.
Voici un bout de doc détaillant ça :
7.3.3 L'approche par modulo Nous savons tout que le reste de la division d'un nombre par N est compris entre 0 et N-1 au sens large. Une approche naïve consisterait donc à écrire :
int lancerUnDe ( int nombreDeFaces ) { return ( rand () % nombreDeFaces )+1; }
Cette approche est pernicieuse car elle donne l'impression de bien marcher, pourtant elle introduit un biais qui a tendance à favoriser les petits jets de dés. Prenons pour illustrer la valeur 10 pour RAND_MAX, et lançons un dé à 4 faces. Supposons que la fonction rand est parfaite, c'est à dire qu'elle a autant de chance de renvoyer n'importe quelle valeur entre 0 et 10. Les résultats possibles sont indiqués tab. 7.1 page suivante
Tab. 7.1 Biais introduit par un modulo sur les résultats de rand Valeur de rand 0 1 2 3 4 5 6 7 8 9 10 Résultats du modulo 0 1 2 3 0 1 2 3 0 1 2 On peut voir sur cet exemple que la probabilité d'obtenir un 0, un 1 ou un 2 est de 3/11 alors que celle d'obtenir un 3 n'est que de 2/11 . Ce biais pour les faible valeurs devient peu important à partir du moment où RAND_MAX est très grand par rapport à nombreDeFaces. Il est néanmoins possible de le supprimer complètement. L'idée est sur l'exemple précédant de commencer par rejeter les résultats 8, 9 et 10 pour rand avant que de calculer le modulo.
/** * Cette fonction lance un dé à nombreDeFaces faces et retourne * sa valeur . Elle suppose que srand a été appelé auparavant . */ int lancerUnDe1 ( int nombreDeFaces ) { int const seuil = RAND_MAX - ( RAND_MAX % nombreDeFaces ); int valeurBrute = rand (); while ( valeurBrute >= seuil ) { valeurBrute = rand (); } return ( valeurBrute % nombreDeFaces )+1; }
-- Loïc
heinquoi
"Alexandre" a écrit dans le message de news:40c4b5a5$0$26911$
Exemple pour obtenir un nombre entre 0 et Nmax (si Nmax < RAND_MAX) :
rand() % Nmax ;
merci , j'ai fait
int randomize =0; for (int i = sizeof (int); i>0;i--) randomize+=(rand()%0xff))<<(i*8);
cordialement H
"Alexandre" <alex.g@netcourrier.com> a écrit dans le message de
news:40c4b5a5$0$26911$626a14ce@news.free.fr...
Exemple pour obtenir un nombre entre 0 et Nmax (si Nmax < RAND_MAX) :
rand() % Nmax ;
merci , j'ai fait
int randomize =0;
for (int i = sizeof (int); i>0;i--) randomize+=(rand()%0xff))<<(i*8);
Troisième solution : <http://www.gabi-soft.fr/code/Util/Basic/Random/>
-- ;-) FLL, Epagneul Breton
Arnaud Debaene
heinquoi wrote:
"Alexandre" a écrit dans le message de news:40c4b5a5$0$26911$
Exemple pour obtenir un nombre entre 0 et Nmax (si Nmax < RAND_MAX) :
rand() % Nmax ;
merci , j'ai fait
int randomize =0; for (int i = sizeof (int); i>0;i--) randomize+=(rand()%0xff))<<(i*8);
Ne pas oublier d'appeler srand(time(NULL)) une fois avant d'appeler rand, afin d'éviter que la même séquence de nombres pseudo-aléatoires soit répétée à chaque execution du programme.
Arnaud
heinquoi wrote:
"Alexandre" <alex.g@netcourrier.com> a écrit dans le message de
news:40c4b5a5$0$26911$626a14ce@news.free.fr...
Exemple pour obtenir un nombre entre 0 et Nmax (si Nmax < RAND_MAX) :
rand() % Nmax ;
merci , j'ai fait
int randomize =0;
for (int i = sizeof (int); i>0;i--) randomize+=(rand()%0xff))<<(i*8);
Ne pas oublier d'appeler srand(time(NULL)) une fois avant d'appeler rand,
afin d'éviter que la même séquence de nombres pseudo-aléatoires soit répétée
à chaque execution du programme.
"Alexandre" a écrit dans le message de news:40c4b5a5$0$26911$
Exemple pour obtenir un nombre entre 0 et Nmax (si Nmax < RAND_MAX) :
rand() % Nmax ;
merci , j'ai fait
int randomize =0; for (int i = sizeof (int); i>0;i--) randomize+=(rand()%0xff))<<(i*8);
Ne pas oublier d'appeler srand(time(NULL)) une fois avant d'appeler rand, afin d'éviter que la même séquence de nombres pseudo-aléatoires soit répétée à chaque execution du programme.
Arnaud
drkm
"heinquoi" <nospam* writes:
je me suis planté c'est random (2sqrt (8*sizeof(int)) ^^^^^
Mal formé. Un identifiant ne peut commencer par un chiffre, et un nombre ne contenir de lettres.
Troisième solution : <http://www.gabi-soft.fr/code/Util/Basic/Random/>
Merci:-).
Il ne faut pas oublier l'offre de Boost, non plus (http://www.boost.org/libs/random/index.html).
Ce qu'offre Boost ou ma bibliothèque, par rapport à rand() tout court, c'est avant tout un générateur d'une qualité connue et garantie.
Note aussi que ni mon générateur, ni ceux de Boost (je crois) ne sont capable de générer des chiffres aléatoirs sur l'intervalle [0...INT_MAX] ou [INT_MIN...INT_MAX]. Pour ça, je crois qu'il a bien choisi la bonne solution, générer et assembler les bytes. (Note bien que ta solution ne génère pas forcément une distribution uniforme. Et que dans le cas des entiers signés, qui était le problème au départ, elle contient un comportement indéfini.)
-- James Kanze GABI Software Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Fabien LE LEZ <gramster@gramster.com> wrote in message
news:<80j9c0lhegrbs6aatdjqucqfk63l7uuh3i@4ax.com>...
On Mon, 7 Jun 2004 21:54:24 +0200, "heinquoi"
<nospam*heinquoi1@libertysurf.fr> wrote:
int randomize =0;
for (int i = sizeof (int); i>0;i--) randomize+=(rand()%0xff))<<(i*8);
Troisième solution : <http://www.gabi-soft.fr/code/Util/Basic/Random/>
Merci:-).
Il ne faut pas oublier l'offre de Boost, non plus
(http://www.boost.org/libs/random/index.html).
Ce qu'offre Boost ou ma bibliothèque, par rapport à rand() tout court,
c'est avant tout un générateur d'une qualité connue et garantie.
Note aussi que ni mon générateur, ni ceux de Boost (je crois) ne sont
capable de générer des chiffres aléatoirs sur l'intervalle [0...INT_MAX]
ou [INT_MIN...INT_MAX]. Pour ça, je crois qu'il a bien choisi la bonne
solution, générer et assembler les bytes. (Note bien que ta solution ne
génère pas forcément une distribution uniforme. Et que dans le cas des
entiers signés, qui était le problème au départ, elle contient un
comportement indéfini.)
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Troisième solution : <http://www.gabi-soft.fr/code/Util/Basic/Random/>
Merci:-).
Il ne faut pas oublier l'offre de Boost, non plus (http://www.boost.org/libs/random/index.html).
Ce qu'offre Boost ou ma bibliothèque, par rapport à rand() tout court, c'est avant tout un générateur d'une qualité connue et garantie.
Note aussi que ni mon générateur, ni ceux de Boost (je crois) ne sont capable de générer des chiffres aléatoirs sur l'intervalle [0...INT_MAX] ou [INT_MIN...INT_MAX]. Pour ça, je crois qu'il a bien choisi la bonne solution, générer et assembler les bytes. (Note bien que ta solution ne génère pas forcément une distribution uniforme. Et que dans le cas des entiers signés, qui était le problème au départ, elle contient un comportement indéfini.)
-- James Kanze GABI Software Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Alexandre
bonjour,
rand() % Nmax ;
A noter que même si rand() est de bonne qualité (ce qui est loin d'être le cas sur beaucoup de compilateurs), cette façon de faire introduit un biais.
certes, mais au départ on ne précise pas si l'on veut une répartition uniforme des valeurs ;-) c'était ce qui avait de plus rapide.
bonjour,
rand() % Nmax ;
A noter que même si rand() est de bonne qualité (ce qui est loin d'être
le cas sur beaucoup de compilateurs), cette façon de faire introduit un
biais.
certes, mais au départ on ne précise pas si l'on veut une répartition
uniforme des valeurs ;-)
c'était ce qui avait de plus rapide.