 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
heinquoi Guest
|
Posted: Mon Jun 07, 2004 5:43 pm Post subject: il y a t'il une fonction de la STL ( ou STD) qui renvoi un n |
|
|
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
|
|
| Back to top |
|
 |
heinquoi Guest
|
Posted: Mon Jun 07, 2004 5:56 pm Post subject: Re: il y a t'il une fonction de la STL ( ou STD) qui renvoi |
|
|
"heinquoi" <nospam*heinquoi1 (AT) libertysurf (DOT) fr> a écrit dans le message de
news:40c4a8ec$0$12747$636a15ce (AT) news (DOT) free.fr...
| Quote: | 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.
|
|
| Back to top |
|
 |
Alexandre Guest
|
Posted: Mon Jun 07, 2004 6:36 pm Post subject: Re: il y a t'il une fonction de la STL ( ou STD) qui renvoi |
|
|
bonjour,
| Quote: |
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.
| Quote: | 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 ;
|
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Mon Jun 07, 2004 7:52 pm Post subject: Re: il y a t'il une fonction de la STL ( ou STD) qui renvoi |
|
|
Alexandre wrote:
| Quote: | 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
|
|
| Back to top |
|
 |
heinquoi Guest
|
Posted: Mon Jun 07, 2004 7:54 pm Post subject: Re: il y a t'il une fonction de la STL ( ou STD) qui renvoi |
|
|
"Alexandre" <alex.g (AT) netcourrier (DOT) com> a écrit dans le message de
news:40c4b5a5$0$26911$626a14ce (AT) news (DOT) free.fr...
| Quote: | 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* ;
cordialement
H
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Mon Jun 07, 2004 8:16 pm Post subject: Re: il y a t'il une fonction de la STL ( ou STD) qui renvoi |
|
|
On Mon, 7 Jun 2004 21:54:24 +0200, "heinquoi"
<nospam*heinquoi1 (AT) libertysurf (DOT) fr> wrote:
| Quote: | int randomize =0;
for (int i = sizeof (int); i>0;i--) randomize+=(rand()%0xff))<<(i* ;
|
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
|
|
| Back to top |
|
 |
Arnaud Debaene Guest
|
Posted: Mon Jun 07, 2004 10:09 pm Post subject: Re: il y a t'il une fonction de la STL ( ou STD) qui renvoi |
|
|
heinquoi wrote:
| Quote: | "Alexandre" <alex.g (AT) netcourrier (DOT) com> a écrit dans le message de
news:40c4b5a5$0$26911$626a14ce (AT) news (DOT) 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* ;
|
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
|
|
| Back to top |
|
 |
drkm Guest
|
Posted: Mon Jun 07, 2004 10:14 pm Post subject: Re: il y a t'il une fonction de la STL ( ou STD) qui renvoi |
|
|
"heinquoi" <nospam*heinquoi1 (AT) libertysurf (DOT) fr> writes:
| Quote: | 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
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Tue Jun 08, 2004 8:38 am Post subject: Re: il y a t'il une fonction de la STL ( ou STD) qui renvoi |
|
|
Fabien LE LEZ <gramster (AT) gramster (DOT) com> wrote
| Quote: | On Mon, 7 Jun 2004 21:54:24 +0200, "heinquoi"
nospam*heinquoi1 (AT) libertysurf (DOT) fr> wrote:
int randomize =0;
for (int i = sizeof (int); i>0;i--) randomize+=(rand()%0xff))<<(i* ;
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
([url]http://www.boost.org/libs/random/index.html)[/url].
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
|
|
| Back to top |
|
 |
Alexandre Guest
|
Posted: Tue Jun 08, 2004 5:21 pm Post subject: Re: il y a t'il une fonction de la STL ( ou STD) qui renvoi |
|
|
bonjour,
| Quote: | 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.
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Tue Jun 08, 2004 5:37 pm Post subject: Re: il y a t'il une fonction de la STL ( ou STD) qui renvoi |
|
|
On Tue, 8 Jun 2004 19:21:49 +0200, "Alexandre"
<alex.g (AT) netcourrier (DOT) com> wrote:
| Quote: | 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
|
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Tue Jun 08, 2004 8:26 pm Post subject: Re: il y a t'il une fonction de la STL ( ou STD) qui renvoi |
|
|
Fabien LE LEZ wrote:
| Quote: | On Tue, 8 Jun 2004 19:21:49 +0200, "Alexandre"
[email]alex.g (AT) netcourrier (DOT) com[/email]> 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;
}
|
Pour tester cette fonction, le test suivant me semble pas trop mal :
void f(int i)
{
assert (MonRand (i) <= i);
}
Or, ce test
f(-1);
Montre que ta proposition ne répond pas aux specs. ;p
--
Loïc
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Tue Jun 08, 2004 8:34 pm Post subject: Re: il y a t'il une fonction de la STL ( ou STD) qui renvoi |
|
|
On Tue, 08 Jun 2004 22:26:54 +0200, Loïc Joly
<loic.actarus.joly (AT) wanadoo (DOT) fr> wrote:
| Quote: | f(-1);
Montre que ta proposition ne répond pas aux specs. ;p
|
C'est logique : il n'existe pas d'entier à la fois >= 0 et <= 1. Donc
la fonction ne peut rien renvoyer ; or son protoype lui impose de
renvoyer un entier. Du coup, comportement indéfini, on peut s'attendre
à tout.
Bon, d'un autre côté, ça illustre le fait qu'il vaut mieux utiliser
des "unsigned int"...
--
FLL, Epagneul Breton
|
|
| Back to top |
|
 |
Gabriel Dos Reis Guest
|
Posted: Wed Jun 09, 2004 2:24 pm Post subject: Re: il y a t'il une fonction de la STL ( ou STD) qui renvoi |
|
|
Fabien LE LEZ <gramster (AT) gramster (DOT) com> writes:
| Quote: | On Tue, 08 Jun 2004 22:26:54 +0200, Loïc Joly
[email]loic.actarus.joly (AT) wanadoo (DOT) fr[/email]> wrote:
f(-1);
Montre que ta proposition ne répond pas aux specs. ;p
C'est logique : il n'existe pas d'entier à la fois >= 0 et <= 1.
|
Il en existe deux : 0 et 1.
-- Gaby
|
|
| Back to top |
|
 |
Alexandre Guest
|
Posted: Wed Jun 09, 2004 2:51 pm Post subject: Re: il y a t'il une fonction de la STL ( ou STD) qui renvoi |
|
|
| Quote: | C'est logique : il n'existe pas d'entier à la fois >= 0 et <= 1.
|
euh si, il y en a deux : 0 et 1.
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|