Fonction random

cs_fayrous Messages postés 48 Date d'inscription lundi 23 février 2009 Statut Membre Dernière intervention 30 avril 2009 - 17 avril 2009 à 02:21
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 - 17 avril 2009 à 11:23
bsr
pouvez vous me dire est ce que on peut utiliser la fonction randomize en c#
j'ai utiliser la fonction random mais les valeurs aléatoires prise par random se répéte.comment puisse je les éviter.
merci

5 réponses

SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
17 avril 2009 à 07:33
Hello,

Je pense que tu fais quelque chose comme ça :

for(...)
{
   Random r = new Random();
   //utilisation de r
}

Dans ce cas, c'est normal que tes valeurs se répètent.

Il faut savoir qu'il n'y a pas de nombres réellement aléatoires avec la classe Random, mais seulement des nombres pseudo-aléatoires.
La différence, c'est que quand tu crées un de ces objets, tu peux lui donner une graine (seed).
Si tu donne toujours la même graine, la suite de nombre sera toujours la même.

Maintenant, si tu ne lui donnes pas cette graine, il va en créer une à partir du nombre de millisecondes écoulées depuis le démarrage de l'ordinateur.
Si ta boucle est courte, il va donc prendre plusieurs fois le même nombre, et par donc te donner plusieurs fois les même valeurs.

Il faut donc faire comme ça :



Random r = new Random();

for(...)

{

   //utilisation de r

}

Voir même déclarer r comme un membre privé (éventuellement static) de la classe.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
0
cs_fayrous Messages postés 48 Date d'inscription lundi 23 février 2009 Statut Membre Dernière intervention 30 avril 2009
17 avril 2009 à 09:05
Bonjour;
je ne comprends pas le sens du mot graine.
j'ai une fonction qui me rend une tableau.je voudrai que à chaque appelle de cette fonction le résultat soit différent.
private string permutation()
{

string x="";
int h=0;
int j = 2;
Random rnd = new Random();

for (int i = 1; i <= Convert.ToInt32(textBox1.Text); i++)
tab0[i] = i;

var = rnd.Next(2, Convert.ToInt32(textBox1.Text));

tab1[1] = var;

for (int k=1; k<=Convert.ToInt32(textBox1.Text); k++)
{
if (tab0[k] != var && j <=Convert.ToInt32(textBox1.Text))
{
tab1[j] = tab0[k];
j++;
}

}
for (int i = 1; i <=Convert.ToInt32(textBox1.Text); i++)
x =x+","+tab1[i];

return x;
}

comment je doit faire?
pouvez vous me aidez.
merci d'avance.
0
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
17 avril 2009 à 09:32
Comment est appelée cette fonction, une fois, ou de multiple fois depuis une boucle ?

De plus, quelques petits conseils :

- Les tableaux en C# commence à l'index 0, ici, tu commence toujours à 1, mais peut-être est-ce voulu.
- Plutôt que de mettre plusieurs fois Convert.ToInt32(textBox1.Text), mets cette valeur dans une variable entière.
- Pour la concaténation de chaines de charactères, utilise plutôt un StringBuilder (dans System.Text), c'est plus efficace que x =x+","+tab1[i];

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
0
cs_fayrous Messages postés 48 Date d'inscription lundi 23 février 2009 Statut Membre Dernière intervention 30 avril 2009
17 avril 2009 à 09:39
Rebonjoiur,
ma fonction est appelée une seule fois.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
17 avril 2009 à 11:23
Salut

Tu dis que cette fonction est appelée une seule fois, et que la valeur est à chaque fois la même ? Est-tu sûr que ce n'est pas une autre partie de ton code qui pose problème ? Car l'utilisation de la classe Random est bien faite dans ton code. Tu devrais essayer de mettre un point d'arrêt à la ligne tab1[1] = var; (en cliquant à gauche de ta ligne (tu verras un point rouge)) et d'exécuter ce code afin de vérifier la valeur de var à chaque fois (en mettant ta souris dessus) au moment du point d'arrêt.

Quant à ce qu'est une graine, voici un exemple très simplifié.
Un nombre aléatoire ça n'existe pas en informatique (ça existera probablement avec les ordinateurs quantiques, mais on n'en est pas là). Donc grosso-modo, un nombre aléatoire, c'est une suite de nombre dans ce genre là :
indice :    10      11      12       13       14        15 ...
valeur :  914     802      3      2168      80     5379 ...
si tu fais new Random(12); tu auras rnd.next() 3. rnd.next() 2168. rnd.next() = 80. Et ce à chaque fois que tu éxécuteras le code. 12 est ta graine dans cet exemple.
Si, en revanche, tu fais new Random(); il prend une graine qui dépend du nombre de millisecondes écoulées depuis le démarrage de l'ordi ou du prog, je sais plus. Donc c'est à peu près sûr que ce ne sera JAMAIS le même nombre, et donc qu'il commencera la suite à un endroit complètement différent.

Krimog : while (!(succeed = try())) ;
- Quand le règlement tu respecteras, ravis de te répondre on sera -
0
Rejoignez-nous