LINUX.ORG.RU

Подскажите пожалуйста по рандомизации [C]

 


0

0

Например есть такое дело

 sprintf(iprnd, "192.168.1.%d", random() % 255); 
нужно чтобы при этом никогда не выпадала еденица, т.е. как лучше сделать, заменять еденицу на что-то другое, или запускать снова random?! И как это собственно эффек. сделать?!

ноль тоже стоит выкинуть (?)

int myrandom()
{
   int r;
   r = 0;
   while (r < 2) r = random() % 255;
 
   return r;
}

ip1981 ☆☆
()

2 + random() % 253;

если надо, чтоб был и 0:

int r = random() % 254;
if( r ) ++r;

lester ★★★★
()

Во-первых, значения random() % 255 в общем случае не распределены равномерно.
Во-вторых, если тебе нужно получить n случайных значений 0,2,...,n, и у тебя есть функция rnd(), отдающая n случайных значений 0,1,...n-1 то можно поступить так: (rnd()+2)%(n+1).

mqspi
()
Ответ на: комментарий от LamerOk

Убейтесь, те кто пишет %255 в этом случае, т.к. последние разряды генерируется далеко не рандомно. Поэтому применим _только_ вариант с (double)MAX *random()/(double)(RAND_MAX+1); далее уэе внося изменения как нужно. Так, что бенчмарки тут не причём и сравнивать как-то совсем нечего. Если только разные библиотеки для генерации чисел брать. P.S. ну естесственно помнить о том, что начиная с какого-то момента у Вас случайные числа пойдут по кругу, хотя это пофиг если генерируется мало таких чисел.

qnikst ★★★★★
()
Ответ на: комментарий от qnikst

> Убейтесь, те кто пишет %255 в этом случае, т.к. последние разряды генерируется далеко не рандомно. Поэтому применим _только_ вариант

это верно для _конкретного_ типа генератора, который обычно использовался в rand() в libc (из-за своей скорости).

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

к, сожалению, это верно минимум для большинства генераторов случайных чисел. Учитывая то, что эффект Морсальо (Marsaylia чтобы гуглилось лучше) никто не отменял, я смею предположить, что эта проблема есть во всех генераторах случайных чисел.

qnikst ★★★★★
()

В целом задача странная: выдать случайным образом ip для одного компа в сети, т.к. алгоритм никак не учитывает то, что часть элементов множества [2..254] (или {0} U [2..254] как в изначальном) может быть уже занято.

Ясное дело что выбор из [0..253] с переобозначенным 1->254 будет работать быстрее чем ещё 1 случайная выборка, т.к. это в лучшем случае 1 операция умножения 1 сложения и нахождение остатка от деления. В общем случае формула (a*x_{n-1}+b) % m.

qnikst ★★★★★
()
Ответ на: комментарий от dilmah

спасибо, за исправление. в след раз буду перепроверять фамилии перед постом

qnikst ★★★★★
()
Ответ на: комментарий от qnikst

Так, я не понял. Конец дня. Где капитан ?!?!

LamerOk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.