LINUX.ORG.RU

Гы :) ну вызови random() пять раз :)

Nesk
()

А есть стандартные функции, которые позволяют ограничивать максимальный размер числа ? Допустим мне нужно число в диапазоне 0..5. Или какаим способом это сделать лучше ? Пока я сделал так:

{ long int rnd; srandom(time(NULL)); rnd = random(); for(; rnd > len; rnd /= 3); return (int) rnd; }

P.S. Линк про большие числа помог, спасибо :)

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

1) Можно еще из /dev/urandom читать 2) Для получения маленьких псевдослучайных чисел можно просто: int r = random() % n; где диапазон [0..n-1] 3) Все стандартные функции для генерации случайных чисел не имеют криптографической стойкости . Для этих целей нужно использовать специальные библиотеки

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

Нет, это не для криптографии. Спасибо за совет

anonymous
()

если твой рандом выдаёт максимум 10, что само по себе достаточно странно, ничто не мешает вызвать этот рандом 55 раз и взять от каждого полученного числа по первой цифре.

anonymous
()
Ответ на: комментарий от Motl

>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

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

> НИ В КОЕМ СЛУЧАЕ. Это самый плохой способ.

это плохой способ длй конкретных плохих реализаций rand(). Если использовать /dev/(u)random то этот способ ничуть не хуже других, только быстрее.

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

Скажу для чего мне это надо - для получения случаного элемента из массива, я думаю для этого подойдет и int r = random() % n; , т.к. довольно таки разны результат получается. Или я не прав? :)

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

Совет: поэкспериментируй random() % n, т.е. построй гистограмму и посмотри на распределение. Если будет неудовлетворительное отклонение от равномерного распределения, то лучше использовать (random()*(n-1))/(RAND_MAX+1).

kosmonavt
()
Ответ на: комментарий от Motl

2 Motl

Здесь вопрос в том какую задачу он решает - пример для преподавателя или пишет программный инструмент для конкретной прикладной области. Если первое - то я не возражаю.

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

> программный инструмент для конкретной прикладной области

это все сотрясание воздуха.

Там где нужна _хорошая_ случайность, никто rand() использовать не будет. А человеку нужно просто взять случайный элемент из массива.

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

Полностью согласен. Просто однажды погорел на rand()%n с генерацией двумерного шума - наблюдалась кореляция значений.

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

test.c:7: warning: integer overflow in expression
cat test.c 
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
        int n=5;
        printf("%u\n", (random()*(n-1))/(RAND_MAX+1));
}

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

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 например, и если увидишь повторяющися фрагмент, то
генератор плохой.

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