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
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.
È possibile generare un numero da 0-2100 e sottrarre 100?
generare un numero casuale compreso tra 0 e 2100, e sottrarre 100.
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;
}
}
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);
In C++ 0x saranno migliorare questo per fornire un migliore supporto per esso con un libreria standard.
È 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';
Per quelli senza TR1, boost :: random è abbastanza vicino. – MSalters
Questo non darà una distribuzione uniforme! Inoltre, trovare il numero minimo e massimo di 100000 di tali numeri non è pertinente alla domanda. – darklon
Anche se per caso 'val' era' -100' ogni volta, il 'max' risultante sarebbe sbagliato. Idem per il minimo. –
@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. –