C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

il y a t'il une fonction de la STL ( ou STD) qui renvoi un n
Goto page 1, 2  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
heinquoi
Guest





PostPosted: 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 Reply with quote



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





PostPosted: Mon Jun 07, 2004 5:56 pm    Post subject: Re: il y a t'il une fonction de la STL ( ou STD) qui renvoi Reply with quote




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

Quote:
une idée ?
H





Back to top
Alexandre
Guest





PostPosted: Mon Jun 07, 2004 6:36 pm    Post subject: Re: il y a t'il une fonction de la STL ( ou STD) qui renvoi Reply with quote



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





PostPosted: Mon Jun 07, 2004 7:52 pm    Post subject: Re: il y a t'il une fonction de la STL ( ou STD) qui renvoi Reply with quote

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





PostPosted: Mon Jun 07, 2004 7:54 pm    Post subject: Re: il y a t'il une fonction de la STL ( ou STD) qui renvoi Reply with quote


"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*Cool;

cordialement
H



Back to top
Fabien LE LEZ
Guest





PostPosted: Mon Jun 07, 2004 8:16 pm    Post subject: Re: il y a t'il une fonction de la STL ( ou STD) qui renvoi Reply with quote

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*Cool;

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

--
Wink
FLL, Epagneul Breton

Back to top
Arnaud Debaene
Guest





PostPosted: Mon Jun 07, 2004 10:09 pm    Post subject: Re: il y a t'il une fonction de la STL ( ou STD) qui renvoi Reply with quote

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*Cool;

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





PostPosted: Mon Jun 07, 2004 10:14 pm    Post subject: Re: il y a t'il une fonction de la STL ( ou STD) qui renvoi Reply with quote

"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





PostPosted: Tue Jun 08, 2004 8:38 am    Post subject: Re: il y a t'il une fonction de la STL ( ou STD) qui renvoi Reply with quote

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*Cool;

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





PostPosted: Tue Jun 08, 2004 5:21 pm    Post subject: Re: il y a t'il une fonction de la STL ( ou STD) qui renvoi Reply with quote

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 Wink
c'était ce qui avait de plus rapide.




Back to top
Fabien LE LEZ
Guest





PostPosted: Tue Jun 08, 2004 5:37 pm    Post subject: Re: il y a t'il une fonction de la STL ( ou STD) qui renvoi Reply with quote

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 Wink
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;
}

;-)

--
Wink
FLL, Epagneul Breton

Back to top
Loïc Joly
Guest





PostPosted: Tue Jun 08, 2004 8:26 pm    Post subject: Re: il y a t'il une fonction de la STL ( ou STD) qui renvoi Reply with quote

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





PostPosted: Tue Jun 08, 2004 8:34 pm    Post subject: Re: il y a t'il une fonction de la STL ( ou STD) qui renvoi Reply with quote

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

--
Wink
FLL, Epagneul Breton

Back to top
Gabriel Dos Reis
Guest





PostPosted: Wed Jun 09, 2004 2:24 pm    Post subject: Re: il y a t'il une fonction de la STL ( ou STD) qui renvoi Reply with quote

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





PostPosted: Wed Jun 09, 2004 2:51 pm    Post subject: Re: il y a t'il une fonction de la STL ( ou STD) qui renvoi Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.