2015-12-10 10 views
6

Come si crea una funzione che genera un numero casuale compreso tra 1 e 25 milioni?C++ Numero casuale da 1 a un numero molto elevato (ad esempio 25 milioni)

Ho pensato di utilizzare rand() ma ho ragione nel pensare che il numero massimo, RAND_MAX è = 32000 (lì circa)?

C'è un modo per aggirare questo, un modo che non riduce la probabilità di prelevare numeri molto bassi e non aumenta la probabilità di prelevare numeri alti/medi?

Modifica: il metodo di @Jamey D funzionava perfettamente indipendentemente da Qt.

+4

È possibile utilizzare le utilità in [ ' '] (http://en.cppreference.com/w/cpp/header/random) per farlo. – NathanOliver

+0

['' 'RAND_MAX'''] (http://en.cppreference.com/w/cpp/numeric/random/RAND_MAX) dipende dall'implementazione. È garantito che questo valore sia almeno '' '32767'''. – mepcotterell

+0

@Nathan che dovrebbe essere una risposta –

risposta

10

Si potrebbe (dovrebbe) utilizzare il nuovo 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 non invecchiò su questo sito, ancora nuovo :) – LogicStuff

+0

@LogicStuff In confronto al tempo in cui C++ è stato intorno direi che è ancora piuttosto nuovo: P –

+1

C++ 11 ha adottato queste librerie particolari da boost quindi è disponibile in boost anche se stai usando un'implementazione. –

1

Dai un'occhiata alla ran3

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

Si dovrebbe essere in grado di ottenere ciò che si vuole da esso.

Ran3 è (almeno quando stavo ancora eseguendo la modellazione computazionale) più veloce di rand() con una distribuzione più uniforme, anche se era diversi anni fa. Restituisce un valore intero casuale.

Per esempio, ottenere il codice sorgente dal link qui sopra:

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

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

Mentre questo può teoricamente rispondere alla domanda, [sarebbe preferibile] (// meta.stackoverflow.com/q/8259) per includere parti essenziali della risposta qui e fornire il collegamento per riferimento. – NathanOliver

+1

Sì, stavo ritirando la modifica mentre attendevo sul codice di compilazione. È su adesso.Probabilmente raccomanderei la risposta al C++ 11 su quella che ho dato a meno che tu non abbia bisogno di numeri casuali veramente buoni. – Ajwhiteway

+1

Comunemente, non è possibile utilizzare l'operazione modulo per ridimensionare l'intervallo di generazione di numeri casuali. La distribuzione risultante diventa non uniforme. –