2010-09-30 32 views
9

Devo generare numeri nell'intervallo [-100; +2000] in C++. Come posso farlo con Rand se sono disponibili solo numeri positivi? Ci sono dei modi veloci?Numeri casuali e negativi

risposta

35

generare un numero casuale tra 0 a 2100 quindi sottrarre 100.

Una rapida ricerca google alzato un decent looking article on using Rand(). Include esempi di codice per lavorare con un intervallo specifico alla fine dell'articolo.

4

È possibile generare un numero da 0-2100 e sottrarre 100?

6

generare un numero casuale compreso tra 0 e 2100, e sottrarre 100.

3

ecco il codice.

#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

Questo non darà una distribuzione uniforme! Inoltre, trovare il numero minimo e massimo di 100000 di tali numeri non è pertinente alla domanda. – darklon

+0

Anche se per caso 'val' era' -100' ogni volta, il 'max' risultante sarebbe sbagliato. Idem per il minimo. –

+0

@Cornelius, @ Ben: chi se ne importa? È solo una demo. Se avessi postato solo '(rand()% 2101) -100' sarebbe stato meglio di un campione eseguibile e compilabile? Per favore. –

1

Attualmente la mia sintassi C++ è un po 'arrugginito, ma si dovrebbe scrivere una funzione che prende due parametri: size e offset.

Quindi si generano numeri con il valore size come valore massimo e successivamente si aggiunge l'offset (negativo) a tale valore.

La funzione sarà simile:

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

e che sarebbe stato nel suo caso con:

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

È possibile utilizzare le funzioni casuali C++ TR1 per generare numeri nella distribuzione desiderata.

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

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

Per quelli senza TR1, boost :: random è abbastanza vicino. – MSalters