2015-12-10 1 views
6

Comment créer une fonction qui génère un nombre aléatoire compris entre 1 et 25 millions?C++ Nombre aléatoire de 1 à un très grand nombre (par exemple 25 millions)

J'ai pensé à utiliser rand() mais ai-je raison de penser que le nombre maximum, RAND_MAX est = 32000 (il ya environ)? Y at-il un moyen de contourner ce problème, de manière à ne pas réduire la probabilité de choisir des nombres très bas et d'augmenter la probabilité de choisir des nombres élevés/moyens?

Edit: La méthode de James D a fonctionné parfaitement indépendamment de Qt.

+4

Vous pouvez utiliser les utilitaires [ ' '] (http://fr.cppreference.com/w/cpp/header/random) pour ce faire. – NathanOliver

+0

['' 'RAND_MAX'''] (http://fr.cppreference.com/w/cpp/numeric/random/RAND_MAX) dépend de l'implémentation. Il est garanti que cette valeur est au moins '' '' 32767'''. – mepcotterell

+0

@Nathan qui devrait être une réponse –

Répondre

10

Vous pouvez (si) utiliser le nouveau C++ 11 std::uniform_real_distribution

#include <random> 

std::random_device rd; 
std::mt19937 gen(rd()); 

std::uniform_real_distribution<> distribution(1, 25000000); 

//generating a random integer: 
double random = distribution(gen); 
+0

C++ 11 ne vieillissait pas sur ce site, toujours nouveau :) – LogicStuff

+0

@LogicStuff Par rapport à l'époque où C++ a été autour, je dirais qu'il est encore assez nouveau: P –

+1

C++ 11 a adopté ces bibliothèques particulières de boost donc c'est disponible en boost même si vous utilisez une implémentation. –

1

Jetez un oeil à RAN3

http://www.codeforge.com/read/33054/ran3.cpp__html

Vous devriez être en mesure d'obtenir ce que vous voulez de lui. Ran3 est (au moins quand j'étais encore en train de faire de la modélisation computationnelle) plus rapide que rand() avec une distribution plus uniforme, même si c'était il y a plusieurs années. Renvoie une valeur entière aléatoire.

Par exemple, obtenir le code source à partir du lien ci-dessus:

int main() { 
    srand(time(null)); 

    int randomNumber = ran3(rand()) % 25000000; 
    int nextRandomNumber = ran3(randomNumber); 
} 
+2

Alors que cela peut théoriquement répondre à la question, [il serait préférable] (// meta.stackoverflow.com/q/8259) d'inclure le parties essentielles de la réponse ici, et fournir le lien pour référence. – NathanOliver

+1

Ouais, je cherchais à l'édition en attendant de compiler le code. C'est maintenant.Je recommanderais probablement la réponse C++ 11 par rapport à celle que j'ai donnée à moins que vous ayez besoin de très bons nombres aléatoires. – Ajwhiteway

+1

Généralement, vous ne pouvez pas utiliser l'opération modulo pour mettre à l'échelle l'intervalle de génération de nombres aléatoires. La distribution résultante devient non uniforme. –