Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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
Avatar
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

10 réponses

1 2
Avatar
heinquoi
"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




Avatar
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 ;

Avatar
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

Avatar
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

Avatar
Fabien LE LEZ
On Mon, 7 Jun 2004 21:54:24 +0200, "heinquoi"
<nospam* wrote:

int randomize =0;
for (int i = sizeof (int); i>0;i--) randomize+=(rand()%0xff))<<(i*8);


Autre solution :

unsigned reponse= 0;
for (unsigned i= UINT_MAX; i>0; i/=RAND_MAX)
{
reponse*= RAND_MAX;
reponse+= rand();
}

Troisième solution : <http://www.gabi-soft.fr/code/Util/Basic/Random/>

--
;-)
FLL, Epagneul Breton

Avatar
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


Avatar
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.

--drkm

Avatar
kanze
Fabien LE LEZ wrote in message
news:...
On Mon, 7 Jun 2004 21:54:24 +0200, "heinquoi"
<nospam* wrote:

int randomize =0;
for (int i = sizeof (int); i>0;i--) randomize+=(rand()%0xff))<<(i*8);


Autre solution :

unsigned reponse= 0;
for (unsigned i= UINT_MAX; i>0; i/=RAND_MAX)
{
reponse*= RAND_MAX;
reponse+= rand();
}

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


Avatar
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.


Avatar
Fabien LE LEZ
On Tue, 8 Jun 2004 19:21:49 +0200, "Alexandre"
wrote:

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.


Nan. Si on ne précise pas du tout la répartition, le plus rapide est
de prendre une valeur fixe quelconque. Par exemple :

int MonRand (int maximum)
{
return 0;
}

;-)

--
;-)
FLL, Epagneul Breton

1 2