Поради принципа на гълъбовата дупка, не можете просто да използвате
output = min + (rand() % (int)(max - min + 1))
за генериране на безпристрастен, еднакъв резултат. Този отговор на подобен въпрос предоставя едно решение, но е много разточително по отношение на консумираните произволни битове.
Например, ако произволният диапазон на източника е нисък, тогава шансовете да се наложи да генерирате втора стойност от източника могат да бъдат доста високи. Алтернативно, използването на по-голям обхват на източника също е разточително.
Въпреки че съм сигурен, че може да се извлече оптимален размер на диапазона на източника, това не отговаря на въпроса, че може да има по-добър алгоритъм, вместо да оптимизира този.
[РЕДАКТИРАНЕ] Моята идея е показана в отговорите, за да доведе до пристрастни резултати.
Един подход, който ми хрумва, е
- Консумирайте минималния брой битове, необходими за покриване на желания диапазон.
- Ако тази стойност е извън желания диапазон, изхвърлете само един бит и консумирайте още един.
- Повторете при необходимост.
rand()
предлага нещо по следния начин:min + (int) (((double) rand() / (RAND_MAX + 1.0)) * (max - min + 1))
. Идеята е да мащабирате изхода отrand()
в дроб в диапазона[0, 1)
, след това да умножите по вашия диапазон и да добавите вашия минимум, за да получите число в диапазона[min, max)
. Вероятно има начини да го направите, без да прибягвате до по-бавни операции с плаваща запетая, но дали искате да ги използвате ще зависи от вашите очаквания за производителност и колко сложни искате да получите... - person twalberg   schedule 27.12.2013rand()
връща фиксиран брой произволни битове, предлагате ли да използвате само някои от тях и да запазите останалите за по-късно? Това изглежда много по-тромаво от необходимото, тъй като битовете са безплатни. Ако се притеснявате от изтощаването на битовия поток (което наистина означава, че сте започнали да повтаряте произволната последователност), тогава трябва да помислите за по-добър (истински?) произволен източник. - person Dwayne Towell   schedule 27.12.2013