2010-09-30 10 views
9

Je dois générer des nombres dans la plage [-100; +2000] en C++. Comment puis-je faire cela avec rand s'il n'y a que des nombres positifs disponibles? Y a-t-il des moyens rapides?Numéros aléatoires et négatifs

Répondre

35

générer un nombre aléatoire entre 0 et 2100 puis soustrayez 100.

Une recherche rapide Google se un decent looking article on using Rand(). Il comprend des exemples de code pour travailler avec une gamme spécifique à la fin de l'article.

4

Pouvez-vous générer un nombre de 0-2100 et soustraire 100?

6

générer un nombre aléatoire entre 0 et 2100, et soustrayez 100.

3

Voici le code.

#include <cstdlib> 
#include <ctime> 

int main() 
{ 
    srand((unsigned)time(0)); 
    int min = 999, max = -1; 
    for(size_t i = 0; i < 100000; ++i) 
    { 
     int val = (rand()%2101)-100; 
     if(val < min) min = val; 
     if(val > max) max = val; 
    } 

} 
+0

Ceci ne donnera pas une distribution égale! De plus, trouver le minimum et le maximum de 100 000 tels nombres n'est pas pertinent à la question. – darklon

+0

Aussi, si par hasard 'val' était' -100' à chaque fois, le 'max' résultant serait faux. Idem pour le minimum. –

+0

@Cornelius, @Ben: Qui s'en soucie? C'est juste une démo. Si j'avais posté juste '(rand()% 2101) -100' qui aurait été mieux qu'un échantillon compilable et exécutable? S'il vous plaît. –

1

Actuellement ma syntaxe C++ est un peu rouillé, mais vous devez écrire une fonction qui prend deux paramètres: size et offset.

Vous générez ainsi des nombres avec le size donné comme valeur maximale et ajoutez ensuite le décalage (négatif).

La fonction ressemblerait à ceci:

int GetRandom(int size, int offset = 0); 

et serait appelé dans votre cas:

int myValue = GetRandom(2100, -100); 
5

Vous pouvez utiliser les fonctions aléatoires C++ TR1 pour générer des nombres dans la distribution souhaitée.

std::random_device rseed; 
std::mt19937 rng(rseed()); 
std::uniform_int<int> dist(-100,2100); 

std::cout << dist(rng) << '\n'; 
+0

Pour ceux sans TR1, boost :: random est assez proche. – MSalters

Questions connexes