Ne pas générer deux mêmes nombres aléatoires à la suite
Résolu/Fermé
Bushizo
Bushizo
- Messages postés
- 99
- Date d'inscription
- vendredi 20 février 2015
- Statut
- Membre
- Dernière intervention
- 8 janvier 2016
Bushizo
- Messages postés
- 99
- Date d'inscription
- vendredi 20 février 2015
- Statut
- Membre
- Dernière intervention
- 8 janvier 2016
A voir également:
- Ne pas générer deux mêmes nombres aléatoires à la suite
- Ne pas générer deux mêmes nombres aléatoires à la suite ✓ - Forum - C
- Générer les mêmes nombres aleatoires enMatlab ✓ - Forum - Matlab
- [c] génération uniforme de nombres aléatoires ✓ - Forum - C
- [C/C++] Générer beaucoup de nombres aléatoire ✓ - Forum - C++
- Générer plusieurs nombres aléatoires entre deux bornes ✓ - Forum - C
3 réponses
[Dal]
15 juil. 2015 à 19:10
- Messages postés
- 5840
- Date d'inscription
- mercredi 15 septembre 2004
- Statut
- Contributeur
- Dernière intervention
- 16 mai 2022
15 juil. 2015 à 19:10
Salut Bushizo,
Une simple boucle while à insérer dans ta boucle effectuant les tirages permet de faire ceci :
Je ne vois pas trop où est la difficulté pour toi.
Montre ton code et dis nous là où tu bloques.
Dal
Une simple boucle while à insérer dans ta boucle effectuant les tirages permet de faire ceci :
Tant que tirage courant == tirage précédent
faire un nouveau tirage
Fin tant que
Je ne vois pas trop où est la difficulté pour toi.
Montre ton code et dis nous là où tu bloques.
Dal
jisisv
Modifié par jisisv le 15/07/2015 à 19:56
- Messages postés
- 3645
- Date d'inscription
- dimanche 18 mars 2001
- Statut
- Modérateur
- Dernière intervention
- 15 janvier 2017
Modifié par jisisv le 15/07/2015 à 19:56
Un petit code vite bidouillé et à améliorer:
Exécution:
Est tu certain qu'il s'agit de générer des entiers aléatoires ou des chaînes numériques de longueur fix ?
Gates gave ^W sold you the windows.
GNU gave us the whole house.(Alexandrin)
#include <stdlib.h> #include <stdio.h> int isvalid(int value) { char buffer[4]; char *ptr = buffer +2, *pptr= buffer+1; sprintf(buffer, "%3d", value); while( (pptr >= buffer) && (*pptr != ' ') ) { // printf("%c%c\n", *pptr, *ptr); if( *ptr == *pptr) return 1; ptr = pptr; pptr--; } return 0; } int main(int argc, char **argv) { const int range=1000; int maxiter; int iter, value; if( argc <2) return(EXIT_FAILURE); maxiter = atoi(argv[1]); for(iter=0; iter <maxiter; iter++) { value = rand() % range; if (isvalid(value) ==1) printf("|%3d|\n", value); } return 0; }
Exécution:
johand@bata:~/src/CCM$ gcc -Wall -o random2 random2.c ; ./random2 10 |886| |777| |335|
Est tu certain qu'il s'agit de générer des entiers aléatoires ou des chaînes numériques de longueur fix ?
Gates gave ^W sold you the windows.
GNU gave us the whole house.(Alexandrin)
[Dal]
Modifié par [Dal] le 15/07/2015 à 20:45
- Messages postés
- 5840
- Date d'inscription
- mercredi 15 septembre 2004
- Statut
- Contributeur
- Dernière intervention
- 16 mai 2022
Modifié par [Dal] le 15/07/2015 à 20:45
Salut jisiv,
Si on tire des chiffres (donc des nombres de 0 à 9) à la suite pour fabriquer le nombre à obtenir, c'est beaucoup plus facile de contrôler qu'il n'y a pas de répétitions consécutives, comme proposé là.
En ce qui concerne ton code, à l'exécution, on dirait que tu obtiens l'effet opposé à celui recherché, à moins que j'aie raté un truc... ?
:-)
Dal
Si on tire des chiffres (donc des nombres de 0 à 9) à la suite pour fabriquer le nombre à obtenir, c'est beaucoup plus facile de contrôler qu'il n'y a pas de répétitions consécutives, comme proposé là.
En ce qui concerne ton code, à l'exécution, on dirait que tu obtiens l'effet opposé à celui recherché, à moins que j'aie raté un truc... ?
:-)
Dal
jisisv
15 juil. 2015 à 22:38
- Messages postés
- 3645
- Date d'inscription
- dimanche 18 mars 2001
- Statut
- Modérateur
- Dernière intervention
- 15 janvier 2017
15 juil. 2015 à 22:38
Oui, bien sur, je n'affiche que les nombres avec coïncidences, il suffit d'inverser la condition en ligne 36 !
Bushizo
18 juil. 2015 à 19:51
- Messages postés
- 99
- Date d'inscription
- vendredi 20 février 2015
- Statut
- Membre
- Dernière intervention
- 8 janvier 2016
18 juil. 2015 à 19:51
Bonjour à tous et merci de vos réponses, désolé de ne pas avoir pu répondre plus tôt.
Je vais donc essayer les techniques que vous m'avez proposé et vous dirai de laquelle je me suis servi.
Merci encore :)
Je vais donc essayer les techniques que vous m'avez proposé et vous dirai de laquelle je me suis servi.
Merci encore :)
Bushizo
18 juil. 2015 à 21:14
- Messages postés
- 99
- Date d'inscription
- vendredi 20 février 2015
- Statut
- Membre
- Dernière intervention
- 8 janvier 2016
18 juil. 2015 à 21:14
Bon alors avec vos conseils j'ai fait ceci :
Il y a cependant un problème que je ne comprend pas : quand je demande d'afficher les nombres tirés au hasard tout marche comme je veux mais quand je demande d'afficher la valeur de l'indice du tableau comme sur les code que j'ai mis des fois j'ai des 1 qui s'affichent en double...
#include <stdio.h>
#include <stlib.h>
int main()
{
const int MIN = 0, MAX = 9;
srand(time(NULL));
int i = 0;
int nombres[9];
nombres[0] = 1;
nombres[1] = 2;
nombres[2] = 3;
nombres[3] = 4;
nombres[4] = 5;
nombres[5] = 6;
nombres[6] = 7;
nombres[7] = 8;
nombres[8] = 9;
int ancienTirage = 0;
for(i = 0; i <= 15; i++)
{
int tirage = (rand() % (MAX - MIN + 1));
while(tirage == ancienTirage)
{
tirage = (rand() % (MAX - MIN + 1));
}
printf("%d", nombres[tirage]);
ancienTirage = tirage;
}
return 0;
}
Il y a cependant un problème que je ne comprend pas : quand je demande d'afficher les nombres tirés au hasard tout marche comme je veux mais quand je demande d'afficher la valeur de l'indice du tableau comme sur les code que j'ai mis des fois j'ai des 1 qui s'affichent en double...
Bushizo
Modifié par Bushizo le 19/07/2015 à 21:33
- Messages postés
- 99
- Date d'inscription
- vendredi 20 février 2015
- Statut
- Membre
- Dernière intervention
- 8 janvier 2016
- Messages postés
- 99
- Date d'inscription
- vendredi 20 février 2015
- Statut
- Membre
- Dernière intervention
- 8 janvier 2016
Modifié par Bushizo le 19/07/2015 à 21:33
Ok, j'ai fini par résoudre le problème en changeant
Et j'ai mis un espace après
Bushizo
"ancienTirage = 0;"en
"= -1;"
Et j'ai mis un espace après
"%d "et là ça marche! Encore une fois, merci beaucoup!
Bushizo