LINUX.ORG.RU

Случайные числа и /dev/urandom


0

0

$ cat proga.c

#include <stdio.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
int y;

#define RANDOMDEV "/dev/urandom"

char buf[512];
unsigned long seed;
int fd = open(RANDOMDEV,O_RDONLY,0644);
if(fd<0)
printf("Can't open file");
(void)read(fd, buf, sizeof(buf));
seed = strtoul(buf, NULL, 10);
srand(seed);
y=rand();
close(fd);
printf("%d\n",y);

return 0;

}

$gcc -lm try2.c -o try2
И при каждом запуске прога выдаёт одно и то же число.(Точнее,чаще всего одно и то же.Вообще,бывают просткакивают и другие.Где-то на 20-й запуск:) ) В чём проблема? Что я делаю неправильно?

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

Переполнение что ли постоянно происходит, так? А как тогда лучше написать? Подскажите, пжлст! Умучался :(

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

> А как тогда лучше написать?

в первом прибл:

...
unsigned long seed;                                                                                        
int fd = open(RANDOMDEV,O_RDONLY,0644);                                                                    
if(fd<0)                                                                                                   
    printf("Can't open file");                                                                                 
(void)read(fd, (char *)buf, sizeof(long));
srand(seed);                                                                                               
...

dilmah ★★★★★
()

/dev/random - генератор псевдослучайных чисел
/dev/urandom - генератор случайных чисел

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

разница между random (1) и urandom (2) в том, что при при чтении из 1 процесс будет заблокирован до тех пор, пока система не накопит "достаточно" энтропии.

при чтении из 2 процесс в случае нехватки энтропии получит "менее случайные числа", и не будет блокирован.

замечание: энтропия в данном случае - технический жаргон. за деталями в drivers/char/random.c.

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

> энтропия в данном случае - технический жаргон

Ни разу, это понятие из теории информации, означает меру незнания ;)

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

> Оба псевдослучайные, просто /dev/random надёжнее.

основная проблема -- это правильно оценить энтропию событий. Если ядро всегда строго оценивает энтропию снизу, то /dev/random это действительно случайные числа.

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

Кто-нибудь здесь может приветси пример РАБОТАЮЩЕГО генератора случайных чисел на основе /dev/[u]random? Запарился уже - не работает и всё! Всё перепробовал! Не вижу ошибку.

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

> Запарился уже - не работает и всё! Всё перепробовал!
> Не вижу ошибку.

оба этих девайса возвращают при чтении поток случайных
байтов. вы из зачем-то скармливаете strtoul(), которая
работает с текстовым представлением чисел.

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

Да что, здесь никто не может привести пример алгоритма взятия случайных чисел из /dev/random!??? Ну помогите же кто-нибудь!

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

Да какой, блин, алгоритм: читаешь сколько тебе надо байт, и все:

int val;

read(devrandom, &val, sizeof(val));

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

А urandom это принципиально? Проще так:

srand(time(NULL));

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