2014-12-15 18 views
5

OK, prawdopodobnie będzie oznaczony jako powielony, ale szukam odpowiedzi i nie mogę znaleźć czegoś podobnego. Pytanie brzmi: Chcę generować liczby losowe w określonym zakresie [tj. min_value to max_value] i z określonym krokiem. W pierwszej części odpowiedź brzmi:Generowanie liczby losowej w C w zakresie i określonym kroku

int random_value = rand() % max_value + min_value; 

Krok, w jaki sposób mogę to zdefiniować? Przypuszczam, że powyższe rozwiązanie kończy się krokiem 1. Prawidłowo? A jeśli na przykład chcę wygenerować liczby z krokiem 2 (np. 2, 4, ..., 16), co powinienem zrobić?

+2

pomnożyć 'rand()' 'przez step'? –

+0

Lepiej powiedz nam, co chcesz osiągnąć, ponieważ wydaje się, że jest to problem XY. – bitcell

+1

Stefano Sanfilippo przez mnożenie tracisz minimalną wartość – kat

Odpowiedz

3

ten powinien robić to, co chcesz:

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

Działa to, ale nie obejmuje wartości max_value. Jeśli na przykład chcę, aby wartości były z 24 do 44 w kroku 2, 44 nie jest uwzględnione. Wiem, że łatwo jest go rozwiązać (zdefiniować 46 zamiast 44), ale byłoby to mylące. – kat

+0

OK, teraz brakuje ci wspornika – kat

+0

@kat, powinieneś po prostu być w stanie w pierwszej kolejności zwiększyć wartość maksymalną. – Vality

2

Twój „pierwszy krok” jest niewskazane, ponieważ cierpi on z modulo bias.

Wprowadzenie „Step” jest sprawą prostą arytmetyką, można wygenerować liczbę losową w mniejszym zakresie min_value/step do max_value/step i pomnożyć przez wymaganego etapu (random_value * step).

Więc:

#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

Dziękuję Clifford za pomoc. – kat

+0

Zastąpiłeś operatora modulo operatorem podziału. To nie pozbywa się stronniczości, ponieważ wyjaśniony zostanie artykuł, z którym się łączyłeś. –

+0

@ NisseEngström: Byłem nieostrożny. Zmieniłem rozwiązanie, aby użyć ilorazu 'rand()/RAND_MAX', ale przeregulowałem, aby uniknąć zmiennoprzecinkowych i użycie większego typu dla wartości pośredniej, więc będzie działać dla pełnego zakresu RAND_MAX.Również ustalony zakres od minimum do maksimum * włącznie *. Jest prostsze niż rozwiązania sugerowane w łączu i to, co zamierzałem. – Clifford

Powiązane problemy