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

Signaler
Messages postés
298
Date d'inscription
jeudi 25 octobre 2001
Statut
Membre
Dernière intervention
8 juin 2009
-
 Giento -
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

18 réponses

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
60
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 57012 internautes nous ont dit merci ce mois-ci

et pourquoi on ne fait pas nb_alea = (Rand() % 101) ???
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 688
Car sinon t'auras un nombre entre 0 et 100. Ce n'est pas ce qu'on veut.
Messages postés
1
Date d'inscription
mercredi 27 janvier 2016
Statut
Membre
Dernière intervention
27 janvier 2016

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é ;)
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 688
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 ???
Messages postés
12
Date d'inscription
lundi 15 octobre 2007
Statut
Membre
Dernière intervention
15 novembre 2009
23
//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)
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
Messages postés
1
Date d'inscription
dimanche 2 août 2015
Statut
Membre
Dernière intervention
2 août 2015

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 :)
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 688
La réponse donnée par Hilikus ne te convient pas ?
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?
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
Messages postés
176
Date d'inscription
vendredi 15 juin 2001
Statut
Membre
Dernière intervention
17 juillet 2003
29
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
J'ai compris le principe, je vais essayer de le refaire par moi même.

Merci beaucoup.
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;
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.
Messages postés
4
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
19 novembre 2007
1
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
Messages postés
2435
Date d'inscription
jeudi 1 novembre 2007
Statut
Membre
Dernière intervention
16 août 2010
411
tu utilise rand pour prendre un nombre entre 1 et 16 pou choisir 8 case au hasard puis tu les rempli avec des 1
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! :)
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 ???????
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 688
@nyj,
Vous posez une question sur une intervention datant de plus de 3 ans... Vous pensez vraiment qu'il va répondre ? ;-)))
hahaahahahahaa
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
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)) )
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 688
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.
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 688
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,

#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 ;
Messages postés
1
Date d'inscription
mardi 6 mai 2008
Statut
Membre
Dernière intervention
6 mai 2008

commmen la fonction radom travail
en récupérant un chiffre de l'horloge du processeur ?
Quelle fonction jippy?... rand()? Le tirage?