à propos de la fonction aléatoire... - C - Programmation
Marsh Posté le 20-01-2005 à 12:03:30
Si tu fais un #define RAND_MAX 250 ca devrait te mettre la limite a 250, apres tu n'as plus qu'a ajouter 50 à la valeur que te retourne rand().
C'est a vérifier, je ne l'ai jamais utilisé mais normalement c'est ca.
Voili, voilou...
Marsh Posté le 20-01-2005 à 12:06:24
pour avoir un nombre de 1 a 10 c'est ca
j=1+(int) (10.0*rand()/(RAND_MAX+1.0))
donc pour toi
j=50+(int) (250.0*rand()/(RAND_MAX+50.0))
Marsh Posté le 20-01-2005 à 21:42:11
KangOl a écrit : pour avoir un nombre de 1 a 10 c'est ca |
pour avoir un nombre aléatoire réel entre 0 et 1 :
Code :
|
un nombre réel entre 0 et 10 :
Code :
|
un nombre entier entre 0 et 9 :
Code :
|
un nombre entier entre 0 et 10 :
Code :
|
Marsh Posté le 20-01-2005 à 21:48:08
Il me semble que justement, rand() peut retourner RAND_MAX.
Donc il faut diviser par (RAND_MAX+1). D'ailleurs, dans pas mal d'implémentations, RAND_MAX est (une puissance de 2)-1. Donc range*rand()/(RAND_MAX+1) ça revient à faire un décalage de bits vers la droite...
Pour le reste, fab++ a raison
Marsh Posté le 20-01-2005 à 21:57:31
Lam's a écrit : Il me semble que justement, rand() peut retourner RAND_MAX. |
oui, ça peut retourner RAND_MAX, et alors ?
pourquoi diviser par RAND_MAX + 1 ? c'est faux.
Marsh Posté le 20-01-2005 à 22:02:44
++fab a écrit : un nombre entier entre 0 et 10 :
|
si rand() renvoie RAND_MAX, ça vaudra:
(RAND_MAX/RAND_MAX)*11. Donc clairement pas un nombre compris entre 0 et 10
Marsh Posté le 20-01-2005 à 22:08:20
Lam's a écrit : si rand() renvoie RAND_MAX, ça vaudra: |
exa
mais si on ajoute +1, ça fout en l'air le générateur aléatoire
que faire ?
Marsh Posté le 20-01-2005 à 22:14:11
++fab a écrit : exa |
Bah non, ça fout rien en l'air. Ca assure que tu divises par l'entier directement supérieur. Et le générateur congruentiel pseudo-aléatoire continue à suivre la méthode dite de Khris B-Kâ.
L'autre méthode qu'on voit souvent, c'est:
blabla = X*rand()/RAND_MAX;
if (blabla==X)
blabla--;
Ca se vaut, vraiment. De toutes façons, si on avait besoin d'un générateur précis, c'est pas ça qu'on utiliserait...
Marsh Posté le 20-01-2005 à 22:23:07
Lam's a écrit : |
au lieu de décrémenter, faire un nouveau tirage ?
C'est clairement inadapté, c'est évident
Marsh Posté le 21-01-2005 à 01:43:29
rand()%251 + 50
J'avais mal lu entre 50 et 300
Marsh Posté le 21-01-2005 à 08:24:24
SBAM a écrit : rand()%251 + 50 |
Oui, enfin ça, c'est la méthode naive... Des méthodes plus sérieuses ont été exposées plus haut...
http://www.eskimo.com/~scs/C-faq/q13.16.html
Marsh Posté le 21-01-2005 à 08:51:59
D'accord avec Delahaye, c'est une méthode extrèmement dangeureuse car le caractère aléatoire n'est plus vérifié (onb engendre plus souvent les petites valeurs). Seule solution correcte :
Réel entre 0 (compris) et 1 (non compris) :
rand()/(RAND_MAX + 1.0)
et si on cherche à générer un entier vraiement aléatoirement entre deux entiers a (comrpis) et b (non compris) :
a + (int) (floor(((double) ((b-a))*(rand()/(RAND_MAX + 1.0))));
Bon, j'ai mis un peu trop de parenthèse mais c'est juste pas sécurité et pour faire les cast !
Marsh Posté le 21-01-2005 à 10:20:49
nathan_g a écrit : |
pour les reels pas de + 1.0, ça c'est clair.
pour les entiers, j'ai cogité, et je raccroche à la thèse Khris B-Kâ.
1.0, c'est pile la bonne valeur à ajouter à RAND_MAX (qqsoit RAND_MAX).
Marsh Posté le 21-01-2005 à 10:45:25
1.0, c'est pile la bonne valeur à ajouter à RAND_MAX (qqsoit RAND_MAX).
=> En effet, comme rand() donne un entier, le + 1 permet d'obtenir des réels régulièrement répartis entre 0 et RAND_MAX/(RAND_MAX+1), par pas de 1/(RAND_MAX+1)
Marsh Posté le 22-01-2005 à 14:44:39
Et comment faire pour qu'à chaque éxécution du programme les valeurs soient différentes ?
Marsh Posté le 22-01-2005 à 14:56:10
randomize() en début de programme
Marsh Posté le 22-01-2005 à 14:58:12
avec srand(x)
x peut etre pris en utilisant l'horloge (time(0)) par exemple.
Marsh Posté le 22-01-2005 à 21:23:50
JagStang a écrit : randomize() en début de programme |
Ce n'est pas une fonction standard. srand() est standard.
Marsh Posté le 22-01-2005 à 22:06:51
Il va p-e falloir mettre ca dans une FAQ, parce que cette question revient une fois par mois a peu pres.
Marsh Posté le 20-01-2005 à 11:56:25
Bonjour,
Je souhaite affecter une valeur aléatoire comprise entre 50 et 300 à une variable. J'ai appris qu'une fonction rand() existait, mais je n'arrive pas à lui préciser la fourchette. Pourriez-vous m'éclairer ?
PS : désolé pour cette question de gros débutant...