Nombres aléatoires

Résolu
Signaler
Messages postés
246
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
11 mars 2012
-
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
-
Voila : Avant j'utilisais randomize() pour réinit le générateur de
nombres aléatoires et rand() ou random(x) pour générer le nombre. Ca
marchait impec. J'ai été voir sur le forum car randomize() me renvoyais
un petit unknown function sous devcpp. j'ai pu voir que maintenant les
"gens" font un "srand((unsigned) time(NULL));" pour réinit le moteur et
un rand()%x popur générer le nombre. Ca marche mais ca me génère en
fait une suite de nombre compris entre 0 et x dont a chaque passage un
ou deux membre de la liste varient, en gros. Quelqu'un pourrait-il donc
m'indiquer comment changer ça ? Paske c un peu génant quand même. Si
encore toutes les valeurs apparaissaient plus ou moins... Mais la, ya
vraiment des valeurs qui viennent jamais !

<hr size="2" width="100%"> Qui ne tente rien...

Ne risque pas d'avoir grand chose !!!

<hr siz="">

12 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
10
Il y une discussion et un lien dans les commentaires de ce code, ca peut t'aider: il y a d'autres fonctions random

http://www.cppfrance.com/code.aspx?ID=32747
Messages postés
246
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
11 mars 2012

Merci beaucoup. En fin de compte, j'ai fait la méthode srand et
rend mais dans le srand j'ai mis : srand((unsigned int) rand()%time(0))

C'est un peu plus aléatoire que time(0) uniquement !

<hr size="2" width="100%"> Qui ne tente rien...

Ne risque pas d'avoir grand chose !!!

<hr siz="">
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
10
"dont a chaque passage un ou deux membre de la liste varient, en gros"
je comprends pas trop la, quelle liste.
Normalement, tous les nombres entre 0 et x finissent par apparaitre. Tu as fait des tests?
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
10
Si fait assez de rand(), toutes les valeurs sont prises. Essaie par toit même:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <memory.h>

int main()
{
unsigned int i, j, *t;
srand((unsigned int)time(0));
t = new unsigned int[RAND_MAX];
memset(t, 0, RAND_MAX * sizeof(unsigned int));
for(i = 0; i < RAND_MAX; i++)
for(j = 0; j < 1000; j++)
t[rand()]++;

for(i = 0; i < RAND_MAX; i++)
if(!t[i]) printf("%d\n", i);
}
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
10
Honte a moi, j'ai pas libéré la mémoire, et j'ai mélangé C et C++

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <memory.h>

int main()
{
unsigned int i, j, *t;
srand((unsigned int)time(0));
t = malloc(RAND_MAX * sizeof(unsigned int));
memset(t, 0, RAND_MAX * sizeof(unsigned int));
for(i = 0; i < RAND_MAX; i++)
for(j = 0; j < 1000; j++)
t[rand()]++;

for(i = 0; i < RAND_MAX; i++)
if(!t[i]) printf("%d\n", i);

free(t);
}
Messages postés
246
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
11 mars 2012

Si tu veux, je suis en train de proguer un programme d'entraînement à
la dactlo (inutile, je sais, mais c pour m'entraîner à la prog OpenGL)
qui recopie ton clavier de PC et te demande d'appuyer sur une touche.
En fait, à l'écran tu vois une touche en bleu et le reste en gris. La
touche bleu étant celle sur laquelle tu dois appuyer, est prise
aléatoirement. Et bien quand tu lance le prog, toutes les valeurs
seront prises au bout de longtps, je te l'accorde, mais on remarque
nettement que les touches demandées reviennent tout le temps d'ou la
"liste" et que cette "liste" varie, mais pas assez. Donc certaines
touches ne seront presque jamais demandées si l'utilisateur ne reste
pas assez longtemps sur le programme. J'ai deja fait tourner le
programme plusieurs fois et certaines touches ne sont pas encore
sorties !

<hr size="2" width="100%"> Qui ne tente rien...

Ne risque pas d'avoir grand chose !!!

<hr siz="">
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
10
Je ne pense pas, puisque rand() te donne des valeurs plutot petites, en général ca ne changera rien. En plus tu peux pas savoir comme ca change tout le temps
Messages postés
246
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
11 mars 2012

bah bizzarement je trouve que ca marche plutot mieu quand meme !

<hr size="2" width="100%"> Qui ne tente rien...

Ne risque pas d'avoir grand chose !!!

<hr siz="">
Messages postés
246
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
11 mars 2012

Excuse-moi effectivement c l'inverse : time(0)%rand() sinon ca ne sert pas a grand chose.

<hr size="2" width="100%"> Qui ne tente rien...

Ne risque pas d'avoir grand chose !!!

<hr siz="">
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
10
Le truc c'est que tu appelles rand() avant srand(), et donc rand te donne toujours la même chose. Qu'est ce que tu dis de ca?
Messages postés
246
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
11 mars 2012

La première utilisation de rand() est effectivement appelée avant
srand(), mais l'utilisation suivante, non ! Et donc a priori ca marche
quand même (en tout cas, en testant je trouve que effectivement ca
marche mieux)

<hr size="2" width="100%"> Qui ne tente rien...

Ne risque pas d'avoir grand chose !!!

<hr siz="">
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
10
ce que je veux dire, c'est que écrire srand(time(0)%rand()) ou écrire srand(time(0)%10) ca revient au même (j'ai pris 10 au hasard avec ma fonction rand perso)