А есть стандартные функции, которые позволяют ограничивать максимальный размер числа ? Допустим мне нужно число в диапазоне 0..5. Или какаим способом это сделать лучше ? Пока я сделал так:
{ long int rnd; srandom(time(NULL)); rnd = random(); for(; rnd > len; rnd /= 3); return (int) rnd; }
1) Можно еще из /dev/urandom читать 2) Для получения маленьких псевдослучайных чисел можно просто: int r = random() % n; где диапазон [0..n-1] 3) Все стандартные функции для генерации случайных чисел не имеют криптографической стойкости . Для этих целей нужно использовать специальные библиотеки
если твой рандом выдаёт максимум 10, что само по себе достаточно странно, ничто не мешает вызвать этот рандом 55 раз и взять от каждого полученного числа по первой цифре.
>2) Для получения маленьких псевдослучайных чисел можно просто:
> int r = random() % n; где диапазон [0..n-1]
НИ В КОЕМ СЛУЧАЕ. Это самый плохой способ. Гораздо лучше:
int r=1+(int)((double)n + rand()/(RAND_MAX + 1.0));
И вообсче: любой человек, который хоть раз использует случайные числа в своих программах для более-менее серьёзных целей и который не имеет представления как эти числа генерируются, просто обязан прочитать главы 7.0, 7.1 и 7.2 из книги "Numerical Recipes" : http://www.library.cornell.edu/nr/cbookcpdf.html
Скажу для чего мне это надо - для получения случаного элемента из массива, я думаю для этого подойдет и int r = random() % n; , т.к. довольно таки разны результат получается. Или я не прав? :)
Совет: поэкспериментируй random() % n, т.е. построй гистограмму и посмотри на распределение. Если будет неудовлетворительное отклонение от равномерного распределения, то лучше использовать (random()*(n-1))/(RAND_MAX+1).
Здесь вопрос в том какую задачу он решает - пример для преподавателя или пишет программный инструмент для конкретной прикладной области. Если первое - то я не возражаю.
gcc ругается на то, что RAND_MAX объявлен как 2147483647,
т.е. RAND_MAX=0x7FFFFFFF.
RAND_MAX+1 == 0x80000000 == -2147483648
Признаю ошибку. Надо делать вот так (тем более,
что это есть в man-странице).
-----------------------------------------------
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n=5, i;
printf("%u\n", (int)((double)rand()*n/(RAND_MAX+1.0)));
}
-----------------------------------------------
Согласен с Motl - для простого случая - простое решение:
arr[rand() % sizeof(arr)]. Я уже проверил - распределение удовлетворительное. А вообще хороший способ "на глаз" проверить
качество генератора - создать какую-нибудь цифровую картинку,
*.pgm например, и если увидишь повторяющися фрагмент, то
генератор плохой.