2014-12-15 5 views
5

OK, molto probabilmente verrà contrassegnato come duplicato, ma sto cercando una risposta e non riesco a trovare qualcosa di simile. La domanda è: voglio generare numeri casuali all'interno di un intervallo specifico [vale a dire min_value a max_value] e con un passo specifico. Per la prima parte la risposta è:Genera un numero casuale in C all'interno di un intervallo e un passaggio specifico

int random_value = rand() % max_value + min_value; 

Il passo come posso definirlo? Suppongo che la soluzione sopra citata porti al punto 1. Corretto? E se per esempio voglio generare i numeri con il passaggio 2 (ad es. 2, 4, ..., 16), cosa dovrei fare?

+2

Moltiplicare 'rand()' 'per step'? –

+0

meglio dirci cosa vuoi realizzare, perché questo sembra un problema xy. – bitcell

+1

Stefano Sanfilippo per moltiplicazione stai perdendo il valore minimo – kat

risposta

3

Questo dovrebbe fare quello che vuoi:

int GetRandom(int max_value, int min_value, int step) 
{ 
    int random_value = (rand() % ((++max_value - min_value)/step)) * step + min_value; 
    return random_value; 
} 
+0

Funziona, ma esclude il max_value. Se ad esempio voglio che i valori siano compresi tra 24 e 44 con il passo 2, il 44 non è incluso. So che è facile risolverlo (definire 46 anziché 44), ma sarebbe fonte di confusione. – kat

+0

Ok, ora ti manca una staffa – kat

+0

@kat dovresti semplicemente essere in grado di incrementare maxvalue prima effettivamente. – Vality

2

Il tuo "primo passo" è mal consigliato dal momento che soffre di modulo bias.

L'introduzione di un "passo" è una questione di semplice aritmetica, si genera un numero casuale su una gamma più piccola min_value/step a max_value/step e moltiplicare per il tuo passaggio obbligatorio (random_value * step).

Quindi:

#include <stdint.h> 
#include <stdlib.h> 
int random_range(int min_value, int max_value) 
{ 
    // Fix me 
    return rand() % max_value + min_value; 
} 

int random_range_step( int min_value, int max_value, int step) 
{ 
    return random_range(min_value/step, max_value/step) * step ; 
} 

... 

// (e.g. 2, 4, ..., 16) 
int random_value = random_range_step(2, 16, 2) ; 
+0

Grazie Clifford per il tuo aiuto. – kat

+0

È stato sostituito l'operatore modulo con l'operatore di divisione. Questo non elimina il pregiudizio, come spiegherà l'articolo che hai collegato. –

+0

@ NisseEngström: Sono stato negligente con quello. Ho cambiato la soluzione per usare il quoziente 'rand()/RAND_MAX', ma riorganizzato per evitare virgola mobile e usare un tipo più grande per il valore intermedio in modo che funzioni per l'intero intervallo RAND_MAX.Intervallo fissato anche da min a max * inclusive *. È più semplice delle soluzioni suggerite nel link e di ciò che avevo inteso. – Clifford