Je cherche une fonction random en C/C++ [Résolu/Fermé]

TexTwil 300 Messages postés jeudi 25 octobre 2001Date d'inscription 8 juin 2009 Dernière intervention - 21 mars 2002 à 14:37 - Dernière réponse :  Giento
- 21 mars 2017 à 23:15
Salut,
je cherche une fonction random sous C/C++: le fonction random() du C++ renvoie une valeur entre 0 et X mais j'aurais besoin d'une fonction du type:
random(4,5,7,9) qui renverrait soit 4 soit 5 soit 7 soit 9. Je sais pas si ca existe et c pour ca que je demande.
merci
Afficher la suite 
300Messages postés jeudi 25 octobre 2001Date d'inscription 8 juin 2009 Dernière intervention

43 réponses

+44
Utile
15
En C, tu peut faire ainsi

Au début du programme, tu initialises le générateur de nombre aléatoire.

srand(time(null)); // Une fois suffit

ensuite, pour générer un nombre aléatoire, tu n'as plus qu'à taper :

int nb_aleatoire = Rand();

Si tu veut un nombre compris dans un interval, tu te sert de l'opérateur modulo.
exemple; tu veut un nombre entre 1 et 100.

int nb_alea;
nb_alea = (Rand() % 100) + 1;

Il te faudra aussi inclure les bibliothèques :
- stdlib.h
- time.h

J'espere que ca pourra t'aider
Cette réponse vous a-t-elle aidé ?  
et pourquoi on ne fait pas nb_alea = (Rand() % 101) ???
fiddy 11141 Messages postés samedi 5 mai 2007Date d'inscriptionContributeurStatut 18 octobre 2016 Dernière intervention - 11 avril 2012 à 16:29
Car sinon t'auras un nombre entre 0 et 100. Ce n'est pas ce qu'on veut.
Centurion! 1 Messages postés mercredi 27 janvier 2016Date d'inscription 27 janvier 2016 Dernière intervention - 27 janv. 2016 à 11:18
Ou simplement en faisant un random de random :
exemple:
random(random(0,1),random(2,3)) ;
pour avoir que les valeurs 0 et 2 (et pas le 1 compris entre les deux) aprés pour exclure plusieurs chiffres c'est un poil plus compliqué ;)
fiddy 11141 Messages postés samedi 5 mai 2007Date d'inscriptionContributeurStatut 18 octobre 2016 Dernière intervention - 27 janv. 2016 à 23:30
Joli déterrage ! Cela date de 4 ans...
random() n'existe pas en C. rand(a,b); n'existe pas non plus.
Sinon, je ne sais pas à qui tu répondais, mais cela ne répond pas à la problématique posée. Pourquoi un random de random ???
Gorgo13 12 Messages postés lundi 15 octobre 2007Date d'inscription 15 novembre 2009 Dernière intervention - 17 oct. 2007 à 05:36
+20
Utile
//Tu fais une table de pointeurs vers un tableau contenant les nombres possibles du tirage, par exemple
int k;
int Nmax = 10;
int *tab = (int*)calloc(sizeof(int),Nmax);
for (k=0;k<Nmax;k++) tab[k] = k; // ou bien n'importe quelle autre valeur et dans l'ordre ou tu veux

//Ensuite tu definis un tableau de pointeurs vers chacun de ces elements int **ptr,
int **ptr = (int**)calloc(sizeof(int*),Nmax);
for (k=0;k<Nmax;k++) ptr[k] = &tab[k];

//tu definis un indice temporaire NN qui va te servir a generer un nombre aleatoire dans l'intervalle
//[0,NN]
int NN = Nmax-1;

int *tmp_ptr;
int random_index;

for (k=0;k<Nmax;k++)
{
//Tu generes un nombre aleatoire entre 0 et NN,
random_index = (int)(rand()/(float)RAND_MAX * (NN));

//Cela definit le premier nombre aleatoire tire,
printf("%d\n",*ptr[random_index]);

//Ensuite, tu fais une permutation entre le pointeur tire et le dernier element de ton tableau de pointeurs
tmp_ptr = ptr[Nmax-1-k];
ptr[Nmax-1-k] = ptr[random_index];
ptr[random_index] = tmp_ptr;

//Tu decremente N--, de sorte que le dernier element du tableau de pointeur
//(qui est maintenant celui qui vient d'etre tire) ne puisse pas etre a nouveau selectionne.
NN--;
}

et voila... il y a surement plus astucieux, mais au moins ca te garantit que ton code s'execute avec un nombre determine d'iterations, sans etre oblige de tester a chaque nouveau tirage si le nombre a deja ete tire...

PS: j'ai ecrit ca en 5 minutes, alors il est possible que les indices ne soient pas tout a fait corrects (e.g. NN ou NN-1)
+9
Utile
2
Bonjour, je cherche comment utiliser et écrire le code de la fonction random en C++ pour choisir des nombres aléatoires sur l'intervalle [0,1].
Meerci d'avance pour votre aide
zinoubiya 1 Messages postés dimanche 2 août 2015Date d'inscription 2 août 2015 Dernière intervention - 2 août 2015 à 12:09
bonjour , je veux savoir le code de la fonction random en c++pour choisir une liste des nombres aléatoires sur l'intervalle [0,n] . merci d'avance :)
fiddy 11141 Messages postés samedi 5 mai 2007Date d'inscriptionContributeurStatut 18 octobre 2016 Dernière intervention - 2 août 2015 à 23:50
La réponse donnée par Hilikus ne te convient pas ?
+5
Utile
Salut,

j'ai pas compris ta question, ce n'est pas clair. En plus, ca ressemble a un exo de derniere minute a faire, n'est-ce pas?
+3
Utile
Bonjour, SVP j'ai besoin d'un aide !!!

je dois remplir un tableaux d'entiers exp: T[10] et je dois donner la taille maximale et des nombres aléatoires pr remplir le tableau !!!

AIDEZ-MOI SVP
Peguinette 176 Messages postés vendredi 15 juin 2001Date d'inscription 17 juillet 2003 Dernière intervention - 21 mars 2002 à 15:57
+2
Utile
La plus part des fonctions random fonctionne de la meme maniere :

elle renvoie une variable de type int (souvent), le contenu est compris entre 0 et le nombre maximum qui peut etre codé dans un int.

Si tu veux un random plus precis, il faut que tu utilise ce meme random et ensuite, que tu réduise l'intervalle d'etude.

exemple :
Le random te renvoi une valeur entre 0 et 199. Tu veux 4 valeurs.

(random *4)/200 = ton random compris entre 0 et 3

au niveau du code, je te laisse faire car ca fait longtemps que je n'ai plus fait de C, mais pense à caster ton résultat.


---------
Peguinette
+2
Utile
J'ai compris le principe, je vais essayer de le refaire par moi même.

Merci beaucoup.
+2
Utile
1
salut
je cherche une fonction random qui va choisir un nombre aleatoire de cette liste {-1,0,1}
max = 1
min = -1
//c'est dans cette interval que la fonction random va choisi le nombre aléatoire
x = rand() % (max-min) + min;
+1
Utile
Bonjour,

J'ai un peu le même genre de problème sauf que l'intervalle n'est pas constant.

En fait je veux tirer k fois un nombre entre 1 et 10, mais je ne dois pas tirer deux fois le même nombre. Comment faire, sans avoir à tester à chaque fois si le nombre obtenu est déjà sorti auparavant?

Merci d'avance.
ahnung 4 Messages postés samedi 17 novembre 2007Date d'inscription 19 novembre 2007 Dernière intervention - 17 nov. 2007 à 19:26
+1
Utile
salut
mon probleme ressemble beaucoup a celui de TexTwil j ai un tableau bidimensionnel (4 *4) premierement je dois initialiser toutes les cases (elements) avec des 0 ensuite je dois a l aide de la fonction random [srand()] remplir 8 cases avec des 1 ! je planche sur cet exercice depuis trois semaines avec tous les manuels possibles et j en suis venu a me demander si ce ne serait pas moi moi qui manquerai d intelligence lol
ok toute aide sera la bienvenue merci d avance
mype 2448 Messages postés jeudi 1 novembre 2007Date d'inscription 16 août 2010 Dernière intervention - 17 nov. 2007 à 19:38
+1
Utile
tu utilise rand pour prendre un nombre entre 1 et 16 pou choisir 8 case au hasard puis tu les rempli avec des 1
Anjinho49 - 22 nov. 2007 à 17:49
+1
Utile
Bonjour,
j'ai une tite question par rapport à l'utilisation de random (et randomize)..! Je dois réaliser un cheminement aléatoire et je dois les utiliser mais je sais pas trop comment étant donné que je "débute".

Donc ce que je veux faire, compter le nombre de fois que je passe par des cases jusqu'à passer par toutes les cases.
donc en fait, elles sont toutes à zéro au début, puis je vais demander à l'utilisateur de rentrer des coordonnées au clavier pour initialiser puis le prog va calculer le nbre de fois qu'il a fallu pour passer par toutes ses cases.

je sais pas si je suis claire... :D

j'aimerais juste avoir une idée de comment procéder

merci par avance d'une réponse! :)
+1
Utile
3
Bonjour
malgrè les explication sur cette fonction je ne comprend toujours pas comment ça fonctione, il me faudrait un exemple avec un tableau a deux dimension avec un choix de 3 valeurs
merci de bien vouloir me répondre
à+
ta pas comprisquoi exactement ???????
fiddy 11141 Messages postés samedi 5 mai 2007Date d'inscriptionContributeurStatut 18 octobre 2016 Dernière intervention - 10 juil. 2011 à 16:44
@nyj,
Vous posez une question sur une intervention datant de plus de 3 ans... Vous pensez vraiment qu'il va répondre ? ;-)))
hahaahahahahaa
+1
Utile
salut, je veut savoir comment, à partir d'un fichier contenant une séquence aléatoire d'entiers, avoir une séquence aléatoire d'entiers mais de longueur inférieur. Merci
www.nabil.webou.net - 10 juil. 2011 à 15:49
+1
Utile
#include <stdio.h>

#include <stdlib.h>
#include <time.h> //Ne pas oublier d'inclure le fichier time.h

int main(void){
int i = 0,na=0;
int nombre_aleatoire = 0;

srand(time(NULL)); // initialisation de rand
for(i=0; i<100; i++){
na = rand()*rand();
nombre_aleatoire = na/rand()%rand();
printf("%d \t",nombre_aleatoire);
}
return 0;
}


par example ;
oussama.za 1 Messages postés mardi 6 mai 2008Date d'inscription 6 mai 2008 Dernière intervention - 6 mai 2008 à 18:21
0
Utile
1
commmen la fonction radom travail
en récupérant un chiffre de l'horloge du processeur ?
0
Utile
Quelle fonction jippy?... rand()? Le tirage?
0
Utile
3
C'est simple:

La fonction rand() renvoie une valeur entre 0 et RAND_MAX
On peut donc avoir une valeur aléatoire entre 0 et 1 en tapant :
rand()/(double)RAND_MAX

Pour choisir aléatoirement des valeurs prédéfinies, par exemple 4,5,7,9 on peut par exemple faire un tableau de int :
int tab[4];
tab[0]=4; tab[1]=5; tab[2]=7; tab[3]=9;

et tirer aléatoirement l'indice :

int indice= (int) floor( (rand()/(double)RAND_MAX)*4 );

// *4 pour avoir un résultat entre 0 et 4 et floor pour prendre la valeur tronquée (bien penser à inclure la bibliothèque math.h pour avoir floor)

if(indice==4)
indice=3; // pour gérer la chance sur x millions que ça tombe sur 4 pile

tab[indice]; // 4,5,7 ou 9

PS : il ne faut pas oublier d'initialiser la fonction rand() en appelant la fonction srand() (habituellement on fait en début de code un srand(time(NULL)) )
fiddy 11141 Messages postés samedi 5 mai 2007Date d'inscriptionContributeurStatut 18 octobre 2016 Dernière intervention - 5 juil. 2011 à 00:09
pour gérer la chance sur x millions que ça tombe sur 4 pile

C'est pour ça qu'on divise par RAND_MAX + 1.0 et non par RAND_MAX.
D'autant plus qu'avec votre algorithme, la probabilité est biaisée.
Cldt,
Je comprend pas comment d'où vous tirez ces conclusions. Si on divise par RAND_MAX + 1.0, là aussi la probabilité se retrouve biaisée car au lieu d'avoir un chiffre entre 0 et 1 on a par exemple un chiffre entre 0 et 0,999969482421875 (avec RAND_MAX = 32767). Je vous l'accorde l'erreur est faible mais elle est grosso modo la même que la chance que ça tombe sur 4 pile (je suis pas un pro des probabilités mais je dirais que c'est la même)
Là avec mon algo on a la même probabilité de tomber sur tous les indices ( entre 0 et 0,999.. ->0, entre 1 et 1,999..->1, entre 2 et 2,999..->2, et entre 3 et 4 -> 3 ) avec 1/32767 chance de plus de tomber sur 3, alors qu'en divisant par RAND_MAX + 1.0, on a je dirai 1/32767 chance de moins de tomber sur 3.
fiddy 11141 Messages postés samedi 5 mai 2007Date d'inscriptionContributeurStatut 18 octobre 2016 Dernière intervention - 5 juil. 2011 à 19:52
Au temps pour moi, je n'avais pas vu la fonction floor.
Effectivement, ça marche, mais c'est dommage de devoir faire un if et d'utiliser la fonction floor (obligation de joindre la blibliothèque libmath) qui est lourde.
Il vaut mieux mettre : val=(int)(4.0*rand()/(RAND_MAX+1.0)); tout simplement.
D'ailleurs, c'est ce que le man préconise.
Cdlt,