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

La fonction rand() C++

Chaos_Clad
Chaos_Clad
Niveau 10
26 juin 2005 à 13:10:57

:salut:

J´écris un petit programme et j´aurai besoin de savoir comment générer un nombre pseudo-aléatoire entre 100000 et 10000000 avec la fonction rand(), je n´ai rien trouvé qui puisse m´être utile sur Google.

Merci :)

extasy89
extasy89
Niveau 6
26 juin 2005 à 13:32:35

tu dois faire

extasy89
extasy89
Niveau 6
26 juin 2005 à 13:35:52

int x;
srand(time(NULL));
x=rand()%10000000+100000;

dnob700
dnob700
Niveau 10
26 juin 2005 à 13:50:16

et là, ça marchera pas pour le coup.

Ben oui, pour le première fois je suis d´accord qu´il ne faut pas utiliser le modulo. car rand() est compris entre 0 et 65000 je crois, donc là, tu ne pourra pas atteindre tout les nombres que tu vise.

Une méthode, mauvaise, consiste à faire :
x=(float)rand()/MAX_RAND*9900000+100000;

Mais ton x ne pourra pas prendre toutes les valeurs entre cent mille et dix millions, juste certaine d´entre elle, régulièrement espacé.

Donc l´unique bonne solution consiste à réécrire un autre générateur de nombre aléatoire.
Il en existe de très très simple ( mais je ne sais pas les implémenté ailleur que sous VC++ car il faut des __int64) ou des moins simples, mais plus efficaces.

peut-être, solution plus facile, n´a tu pas besoin d´une telle gamme de nombre, ou bien tu peut peut-être te passé des nombres intermédiaires.

Chaos_Clad
Chaos_Clad
Niveau 10
26 juin 2005 à 14:27:22

Bon je verrai plus tard, merci de vos réponses :).

Oui en fait je n´aurai besoin que de 100000, 1000000 et 10000000 :)

dnob700
dnob700
Niveau 10
26 juin 2005 à 14:35:51

x=100000*pow(10,rand()%3);

Chaos_Clad
Chaos_Clad
Niveau 10
26 juin 2005 à 14:40:23

Merci :ok:

BigGamer95
BigGamer95
Niveau 10
28 juin 2005 à 13:59:33

si rand ne va que jusqu´a 65000, y´a une methode pour le tromper

tu tire un nombre entre 1 et 100
ensuite par des if tu lui fait comprendre que
si le resultat est 1 la variable vaut 100000
si le resultat vaut 10 le resultat vaut 1000000

ou plus simple, apres le rand, la variable vaut le resultat * 100000 ( ca revien au meme mais moins de ligne)

BigGamer95
BigGamer95
Niveau 10
28 juin 2005 à 14:03:40

ou encore mieu puisque tu n´a besoin que de 100000, 1000000 et 10000000

tu tire entre 1 et 3
si 1 la variable vaut 100000
pour 2 elle vaut 1000000
et pour 3 , 10000000

3 if, un rand, c´est une solution simple, pas gourmande en ressource et rapide

Chaos_Clad
Chaos_Clad
Niveau 10
28 juin 2005 à 14:13:36

Je suis passé à autre chose depuis mais merci quand même :)

dnob700
dnob700
Niveau 10
28 juin 2005 à 15:13:13

gros_joueur : ma solution est exactement la même que celle que tu dit, mais j´économise tout les if, grace à l´utilisation judicieuse de formule mathématique...

lord_kalipsy
lord_kalipsy
Niveau 10
28 juin 2005 à 17:09:40

dnob700
Posté le 28 juin 2005 à 15:13:13
gros_joueur : ma solution est exactement la même que celle que tu dit, mais j´économise tout les if, grace à l´utilisation judicieuse de formule mathématique...

--> Juste pour dirre comme ça . .. souvent sur quelques supports ( GBA ? ) un ou deux if(s) sont mieux que des divisions/float/multiplications.

M´enfin je dis comme ça hein . ..

dnob700
dnob700
Niveau 10
28 juin 2005 à 17:24:43

ben oui, t´as raison, même si un PC je pense, mais fallait pas lui dire...

quoi que, je pense que le pow avec deux argument int, est assez bien optimisé, et se passe de tout float, ou truc comme ça.

lord_kalipsy
lord_kalipsy
Niveau 10
28 juin 2005 à 17:53:59

Moi je cherche à savoir si il existe une méthode pour mettre des " limites" au random sans pow/multiplications/divisions . .. Tu as une idée sur cela ?

lag-it
lag-it
Niveau 10
28 juin 2005 à 18:33:13

Si tu veux effectuer des modulo avec une puissance de 2, utilise un masque binaire, grâce à & :

rand() & 2^n

Ou n est tel que 2^n est la valeur par laquelle tu souhaites moduler.
Y a pas plus rapide :ok: ( mais il faut une puissance de 2 )

lag-it
lag-it
Niveau 10
28 juin 2005 à 18:33:49

2^n-1, petit erreur :)

lag-it
lag-it
Niveau 10
28 juin 2005 à 18:43:26

Je vais la refaire parce que c´était pas clair :

Si tu veux effectuer des modulo avec une puissance de 2, utilise un masque binaire, grâce à & :

rand() & ( 2^n-1)

Ou n est tel que 2^n est la valeur par laquelle tu souhaites moduler.
Y a pas plus rapide :ok: ( mais il faut une puissance de 2 )

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