Les Allergies
Alimentaires
Posez votre question Signaler

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

TexTwil 307Messages postés 25 octobre 2001Date d'inscription - Dernière réponse le 11 avril 2012 à 16:29
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
Lire la suite 

Je cherche une fonction random en C/C++ »

37 réponses
Réponse
+21
moins plus
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
fiddy- 15 août 2011 à 16:16
Medlee,
Sans le 1, tu auras un nombre compris entre 0 et 99, avec le 1, tu auras donc un nombre compris entre 1 et 100.
zboob - 11 avril 2012 à 10:48
et pourquoi on ne fait pas nb_alea = (Rand() % 101) ???
fiddy- 11 avril 2012 à 16:29
Car sinon t'auras un nombre entre 0 et 100. Ce n'est pas ce qu'on veut.
Ajouter un commentaire
Réponse
+18
moins plus
//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)
Ajouter un commentaire
Réponse
+5
moins plus
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?
Ajouter un commentaire
Réponse
+5
moins plus
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
Ajouter un commentaire
Réponse
+2
moins plus
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
Ajouter un commentaire
Réponse
+2
moins plus
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
Ajouter un commentaire
Réponse
+2
moins plus
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
Ajouter un commentaire
Réponse
+2
moins plus
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
Ajouter un commentaire
Réponse
+1
moins plus
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.
Ajouter un commentaire
Réponse
+1
moins plus
J'ai compris le principe, je vais essayer de le refaire par moi même.

Merci beaucoup.
Ajouter un commentaire
Réponse
+1
moins plus
salut
je cherche une fonction random qui va choisir un nombre aleatoire de cette liste {-1,0,1}
vacancier - 27 oct. 2008 à 01:46
max = 1
min = -1
//c'est dans cette interval que la fonction random va choisi le nombre aléatoire
x = rand() % (max-min) + min;
Ajouter un commentaire
Réponse
+1
moins plus
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- 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,
nibor - 5 juil. 2011 à 11:09
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- 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,
Ajouter un commentaire
Réponse
+0
moins plus
tu utilise rand pour prendre un nombre entre 1 et 16 pou choisir 8 case au hasard puis tu les rempli avec des 1
Ajouter un commentaire
Réponse
+0
moins plus
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! :)
Ajouter un commentaire
Réponse
+0
moins plus
commmen la fonction radom travail
krokoll - 24 mars 2011 à 04:33
en récupérant un chiffre de l'horloge du processeur ?
Ajouter un commentaire
Réponse
+0
moins plus
Quelle fonction jippy?... rand()? Le tirage?
Ajouter un commentaire
Réponse
+0
moins plus
#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 ;
Ajouter un commentaire
Réponse
-1
moins plus
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
à+
nyj - 10 juil. 2011 à 15:51
ta pas comprisquoi exactement ???????
fiddy- 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 ? ;-)))
Ajouter un commentaire
Ce document intitulé « je cherche une fonction random en C/C++ » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?