cs_fayrous
Messages postés48Date d'inscriptionlundi 23 février 2009StatutMembreDernière intervention30 avril 2009
-
17 avril 2009 à 02:21
krimog
Messages postés1860Date d'inscriptionlundi 28 novembre 2005StatutMembreDernière intervention14 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
SharpMao
Messages postés1024Date d'inscriptionmardi 4 février 2003StatutMembreDernière intervention 7 juin 201069 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)
cs_fayrous
Messages postés48Date d'inscriptionlundi 23 février 2009StatutMembreDernière intervention30 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.
SharpMao
Messages postés1024Date d'inscriptionmardi 4 février 2003StatutMembreDernière intervention 7 juin 201069 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)
krimog
Messages postés1860Date d'inscriptionlundi 28 novembre 2005StatutMembreDernière intervention14 février 201549 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 -