CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C] Rand entre 40 et 75 ?

poupstm2
poupstm2
Niveau 29
23 octobre 2012 à 19:31:33

Salut à tous, dans le cadre d'un projet, je cherche un moyen d'obtenir un rand qui sois toujours compris entre 40 et 75...

quelqu'un sait comment y parvenir ?

pour l'instant j'ai teter comme suit :

while(nbrO<40 || nbrO>75)
{
srand (time(NULL));
nbrO= rand ()%75;
AffichageNbrO(nbrO);
}

nbrO contenant le nombre tiré en rand...
cependant, cette technique est plutôt foireuse et prend du temps...

en vous remerciant.

Bunyan
Bunyan
Niveau 17
23 octobre 2012 à 19:36:55

Fais un random entre 0 et 35, puis rajoute 40.

La méthode classique est de faire un random entre 0 et(max-min) puis rajouter min. Après, faire attention aux bornes pour ce qui doit être autorisé/rejeté.

Pseudo supprimé
Pseudo supprimé 23 octobre 2012 à 20:57:47

nbrO = (rand() % 35) + 40

godrik
godrik
Niveau 30
23 octobre 2012 à 21:16:36

n'appelle pas srand dans ta boucle. Ne l'appelle qu'une seule fois au debut de ton programme!

Pseudo supprimé
Pseudo supprimé 23 octobre 2012 à 21:29:55

aparament c pas toujour b1 dutiliser modulo

http://c-faq.com/lib/randrange.html

godrik
godrik
Niveau 30
23 octobre 2012 à 21:40:23

Indeed, j'avais ecrit ca sur le sujet il y a quelques annees:

http://demont.valerie.free.fr/site/momo/www.mandragor.org/article4ef9.html?id=12

(cool, ca a ete sauve par quelqu'un)

Pseudo supprimé
Pseudo supprimé 23 octobre 2012 à 22:43:24

interesant javai deja aprocher le sujet pour faire une implentation du generateur mersene twister pour un langage de prog. maintenant c plus simple intel integre un generateur hardware dans ces cpu (instruction RDRAND). sur le kernel linux on peux lutiliser avec la fonction rdrand_long. je supose ke tu savai deja.

Tikim
Tikim
Niveau 21
23 octobre 2012 à 22:45:43

C'est bien d'être conscient de l'imperfection des fonctions de génération de pseudo-aléatoire, mais faut pas oublier que dans beaucoup de cas on peut s'en contenter sans sacrifice mesurable de qualité.

poupstm2
poupstm2
Niveau 29
23 octobre 2012 à 22:45:44

merci beaucoup pour toutes vos réponses, je vais vite lire et tester tout ca :)

caelacanthe
caelacanthe
Niveau 10
23 octobre 2012 à 22:50:27
  1. Tikim Voir le profil de Tikim
  2. Posté le 23 octobre 2012 à 22:45:43 Avertir un administrateur
  3. C'est bien d'être conscient de l'imperfection des fonctions de génération de pseudo-aléatoire, mais faut pas oublier que dans beaucoup de cas on peut s'en contenter sans sacrifice mesurable de qualité.

:d) je me rappelle d'un projet littéralement grêvé par ladite imperfection, c'est particulièrement dangereux de faire un modulo sur rand() en dépassant les seize premiers bits, quelquefois. les petites valeurs ont tendance à sortir plus souvent :oui:

godrik
godrik
Niveau 30
23 octobre 2012 à 22:54:40

Tikim, j'avais ecrit un generateur de lancer de de pour analyser les niveau dans earthdawn. Mon analyse etait biaise par les le LCG quand je tirais des de separement.

Utiliser une division flotante au lieu d'un modulo ne coute pas beaucoup plus cher et est plus correcte. Pourquoi faire moins bien?

Tikim
Tikim
Niveau 21
23 octobre 2012 à 23:10:51

Je sais pas vraiment de quoi tu parles, mais je suppose que c'est la réponse à ta question : par méconnaissance. Cela dit, cette imperfection se vérifie notamment dans le cas où l'on a besoin d'un grand nombre de valeurs aléatoires, ce qui n'est pas toujours le cas.

Maintenant j'ai jamais étudié la gestion de l'aléatoire en C, je sais juste comment ça fonctionne en gros avec le srand(time). Par contre j'ai fais différents tests récemment en Java sur des lancers de dés, avec Random.nextInt(max) (qui tire entre 0 et max non compris je crois), et avec le rand() basique et un calcul (rand()*(a-b)+b de mémoire, pas sûr). Et sur ces tests j'ai pas vu de différence significative. J'ai aussi testé en faisant instanciant un new Random() à chaque itération, ce qui n'est vraiment pas très propre, et de nouveau j'ai pas eu de différence suffisamment importante pour être citée.

Même avec dix millions de lancers (j'ai dû laisser tourner quelques minutes :o)) ), on restait de l'ordre de la 4 ou 5ème décimale il me semble.

godrik
godrik
Niveau 30
24 octobre 2012 à 02:12:51

lis l'article que je reference, tu vera dequoi je parles.

Si tu tire des couples (a,b) avec a = rand()%FOO; b = rand()%FOO; tu veras que ton tirage manque serieusement d'alea. Il y a des couples (a,b) qui ne sont pas atteignable.

Si dnas un jeu, un rpg par exemple, tu fais des tirages pour chaque personnage a son tour avec un seul objet Random, tu aura de l'alea qui est globalement uniforme, mais si tu regardes les statistiques par personnage, tu vera que l'alea n'est pas forcement uniforme a ce niveua la. C'est ca l'interet principal d'avoir plusieurs objet Random.

Note qu'en effet dnas plein d'applicatin, on s'en fout completement. Cependant, la technique a base de rand()/(float)RAND_MAX*max n'a pas autant de probleme. Alors pourquoi utiliser une technique qui pose probleme alors qu'il en existe une autre qui n'en pose pas autant et qui n'est pas plus difficile a utiliser?

Tikim
Tikim
Niveau 21
24 octobre 2012 à 10:08:37

J'ai l'impression d'avoir compris ton article et ton dernier message mais pas le lien entre les deux :o))

Mais c'est vrai qu'on a trop tendance à tester la moyenne mais à ne pas se préoccuper de l'équiprobabilité de chaque valeur possible dans notre ensemble de nombres à générer...

godrik
godrik
Niveau 30
24 octobre 2012 à 20:08:44

et l'equiprobabilite n'est pas suffisante pour etre uniforme. Il ne faut pas oublier les dependances de markov.

Par exemple, cette suite est equiprobable dans [1:6], mais n'est pas aleatoire uniforme:
1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6,1,
2,3,4,5,6

La moyenne et l'equiprobabilite sont necessaire mais non suffisant pour avoir un bon generateur aleatoire.

chris_27
chris_27
Niveau 10
24 octobre 2012 à 20:18:41

« l'equiprobabilite n'est pas suffisante pour etre uniforme. » :d) si, tout dépend de sur quoi porte l'adjectif uniforme.

La vraie question étant toujours de savoir si ce qu'on veut c'est une valeur, ou une suite de valeurs.

Tikim
Tikim
Niveau 21
24 octobre 2012 à 22:12:46

Ah du coup l'histoire du modulo a effectivement tout son sens ! J'avais jamais imaginé même ce problème. Mais ça reste un cas isolé non ? Dans le graphe de ton article, quand on voit les lignes parallèles ça veut dire que certains points ne seront pas atteints, mais ça ne veut pas dire que ceux qui seront atteints le seront dans l'ordre d'apparition sur la droite... Ou j'ai mal compris ?

godrik
godrik
Niveau 30
24 octobre 2012 à 22:22:33

le graphe dans l'article dit que tous les points ne seront pas atteint. Mon autre exemple indique juste que "toutes les combinaisons apparaissent autant de fois" ne veut pas dire "aleatoire"

Tikim
Tikim
Niveau 21
24 octobre 2012 à 22:27:43

Ok je comprends, merci pour les explications !

Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment