Re: масив чисел
- From
- Oleg I. Khovayko ()
- To
- Oleg Polubasoff
- Date
- 2003-01-07T23:33:51Z
- Area
- RU.ALGORITHMS
From: "Oleg I. Khovayko" <olegh@ncbi.nlm.nih.gov>
Oleg Polubasoff wrote:
>
> RND(n) часто определяют как random()%n, и для практических целей этого
> обычно вполне достаточно. Но, если, как ты говоришь, интересует именно
> "математически верный" алгоритм, то надо иметь ввиду, что результат
> random()%n может быть распределён не равномерно.
Естественно. Я это знаю. Типичный пример: random() дает числа 0..15,
а надо получить случайное число в диапазоне 0..9. Понятно, что если
сделать генератор "x = random() % 10", то числа из интервала 0..5 будут
выпадать вдвое чаще, чем числа из интервала 6..9.
В свою защиту могу сказать то, что я приводил математически верный алгоритм
ПЕРЕМЕШИВАНИЯ, а не генерации случайного числа. И акцентировался я именно на
перемешивании. Поэтому генерацию случайного числа "схалявил". И писать было лениво,
н загромождать исходник-пример мало относящимся к делу мусором не хотелось.
А если уж хочется совсем равномерного распределения от 0 до N, то его делать можно так:
1. Находим некое максимально возможное int Z, такое, что (Z % N == 0) && (Z <= max_random())
2. Генерим равномерно распределенное число:
int x;
while((x = random()) >= Z);
x %= N;
Особое внимание надо обратить на знак сравнения ">= Z". Если наш random()
может выдавать нуль, надо писать именно ">= Z". Если же random() нуля вернуть не может
(а именно такие генераторы распространены наиболее широко), надо писать "> Z".
> О том, что последовательные вызовы random() обычно не независимы, молчу.
Ну естественно! Не хватало нам еще физического генератора случайных чисел...
--
#include <best/regards.hpp>
Oleg I. KHOVAYKO
(301)435-5885 || WEB: http://olegh.spedia.net
--- ifmail v.2.15dev5
* Origin: National Center for Biotechnology Information (2:5020/400)