Signaler

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

Posez votre question TexTwil 300Messages postés jeudi 25 octobre 2001Date d'inscription 8 juin 2009 Dernière intervention - Dernière réponse le 21 mars 2017 à 23:15 par 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
Utile
+48
plus moins
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é ?  
zboob- 11 avril 2012 à 10:48
et pourquoi on ne fait pas nb_alea = (Rand() % 101) ???
fiddy 11141Messages postés samedi 5 mai 2007Date d'inscription ContributeurStatut 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! 1Messages 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 11141Messages postés samedi 5 mai 2007Date d'inscription ContributeurStatut 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 ???
Utile
+20
plus moins
//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)
Utile
+9
plus moins
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 1Messages 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 11141Messages postés samedi 5 mai 2007Date d'inscription ContributeurStatut 18 octobre 2016 Dernière intervention - 2 août 2015 à 23:50
La réponse donnée par Hilikus ne te convient pas ?
Utile
+6
plus moins
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?
Utile
+3
plus moins
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
Utile
+2
plus moins
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
Utile
+2
plus moins
J'ai compris le principe, je vais essayer de le refaire par moi même.

Merci beaucoup.
Utile
+2
plus moins
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;
Utile
+1
plus moins
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.
Utile
+1
plus moins
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
Utile
+1
plus moins
tu utilise rand pour prendre un nombre entre 1 et 16 pou choisir 8 case au hasard puis tu les rempli avec des 1
Utile
+1
plus moins
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! :)
Utile
+1
plus moins
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 11141Messages postés samedi 5 mai 2007Date d'inscription ContributeurStatut 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 ? ;-)))
flappy- 30 oct. 2014 à 15:09
hahaahahahahaa
Utile
+1
plus moins
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
Utile
+1
plus moins
#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 ;
Utile
+0
plus moins
commmen la fonction radom travail
krokoll- 24 mars 2011 à 04:33
en récupérant un chiffre de l'horloge du processeur ?
Utile
+0
plus moins
Quelle fonction jippy?... rand()? Le tirage?
Utile
+0
plus moins
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 11141Messages postés samedi 5 mai 2007Date d'inscription ContributeurStatut 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,
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 11141Messages postés samedi 5 mai 2007Date d'inscription ContributeurStatut 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,

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !