Генерация псевдо-случайных чисел на Си в определенных пределах

Модератор: Модераторы разделов

Аватара пользователя
Kasper_WPS
Сообщения: 312
ОС: Gentoo

Генерация псевдо-случайных чисел на Си в определенных пределах

Сообщение Kasper_WPS »

Нашел вот здесь: http://forum.kai.ru/viewtopic.php?p=30306&...d9cc474076b6b7e, вставил в функцию, чего-то не работает:

Код: Выделить всё

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

long   int randgen(int a, int b){ // Генерация псевдо-случайного числа из предела a,b
static int randx = 1;
 FILE *uptime;
 float time;
 long  int t;
 /* a,b - Границы диапазона */

 /* Вычисление случайного зерна */
 uptime = fopen("/proc/uptime","r");
 fscanf (uptime,"%f",&time);
 fclose (uptime);

 time *= randx;
 t = time;
 time  = time-t;
 randx = time*10000; /* Чем больше число, тем случайнее зерно */

 printf("Randx = %d; Time = %f",randx,time);

 t = a + ((randx * 25173 + 13849)%65536) % ((b-a) + 1);
 randx =  (randx * 25173 + 13849)%65536;

 return t;
}

int main(int argc, char *argv[])
{
 int n,x;
 for(n=0; n<20; n++){
  x = randgen(0,2);
  printf("-%d\n",x);
 }

 return 0;
}

Вывод вот:

Код: Выделить всё

Randx = 4199; Time = 0.419922-2
Randx = 0; Time = 0.000000-1
Randx = 0; Time = 0.000000-1
Randx = 0; Time = 0.000000-1
...дальше то-же самое

Как правильно сделать? C не знаю, только учусь, зато знаю что в php есть mt_rand(), есть ли реализация на Си чего-нибудь подбное
Gentoo Linux - Stage1 - Core2 Q6600 Quad - 2008.0
Kernel: Gentoo-sources - 2.6.36 GCC 4.5.1
XOrg-server 1.9.2 (NVIDIA-9600GT), KDE4 4.5.4
Спасибо сказали:
Аватара пользователя
BlackStar
Сообщения: 1338
Статус: We are all Kosh
ОС: Fedora 10

Re: Генерация псевдо-случайных чисел на Си в определенных пределах

Сообщение BlackStar »

Вот немного попроще:

Код: Выделить всё

#include <stdlib.h>
#include <stdio.h>
int main(void)
{
    int i;
    unsigned seed;

    printf("Enter seed: ");
    scanf("%u", &seed);
    srand(seed);

    for (i=1; i<=10; i++) {
        printf("%10d", 1 + (rand()%6));

        if (i % 5 == 0)
            printf("\n");
    }

    return 0;
}
LightLang Team
Спасибо сказали:
Аватара пользователя
Trash
Сообщения: 66

Re: Генерация псевдо-случайных чисел на Си в определенных пределах

Сообщение Trash »

Kasper_WPS, у тебя не заданы границы диапазона a и b.

Вот здесь похоже считывание с файла

uptime = fopen("/proc/uptime","r");
fscanf (uptime,"%f",&time);
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Генерация псевдо-случайных чисел на Си в определенных пределах

Сообщение Liksys »

А что мешает так сделать (в общем случае), рандомизация по time():

Код: Выделить всё

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main(void)
{
    int count;

    srand( (unsigned int) time(NULL) );

    for (count=0; count < 10; count++)
        printf("%10d\n", 1 + (rand()%6));

    return 0;
}
Спасибо сказали:
Аватара пользователя
Kasper_WPS
Сообщения: 312
ОС: Gentoo

Re: Генерация псевдо-случайных чисел на Си в определенных пределах

Сообщение Kasper_WPS »

Сделал так (http://www.citforum.ru/programming/c_unix/gl_1_1.shtml#1_38):

Код: Выделить всё

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]){
 int n,x;

 char t[sizeof(long)];
 time(t); srand(t[0] + t[1] + t[2] + t[3]);

 for(n=0; n<20; n++){

  int x = 0 + rand() % (2+1-0);

  printf("rand: %d\n",x);
 }

 return 0;
}

Спасибо за варианты, посмотрю как Вы реализовали :) Большое Спасибо :D
Еще вопросик появился, как получить microtime?
Gentoo Linux - Stage1 - Core2 Q6600 Quad - 2008.0
Kernel: Gentoo-sources - 2.6.36 GCC 4.5.1
XOrg-server 1.9.2 (NVIDIA-9600GT), KDE4 4.5.4
Спасибо сказали:
Аватара пользователя
aLexx programmer
Сообщения: 985
Статус: Турук-Макто
ОС: Gentoo -> Ubuntu

Re: Генерация псевдо-случайных чисел на Си в определенных пределах

Сообщение aLexx programmer »

(Kasper_WPS @ Jan 18 2007, в 22:32) писал(а):srand(t[0] + t[1] + t[2] + t[3]);

Зачем так заморачиваться? :)
Спасибо сказали:
Аватара пользователя
BlackStar
Сообщения: 1338
Статус: We are all Kosh
ОС: Fedora 10

Re: Генерация псевдо-случайных чисел на Си в определенных пределах

Сообщение BlackStar »

Это еще что... по сравнению с :

int x = 0 + rand() % (2+1-0);

:)
LightLang Team
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Генерация псевдо-случайных чисел на Си в определенных пределах

Сообщение Liksys »

Если хочется чего-нибудь более интересного, то можно посмотреть man 3 md5. Делаешь хеш для значение time(), складываешь все символы хеша и отдаешь сумму srand()`у.
Спасибо сказали:
Аватара пользователя
Kasper_WPS
Сообщения: 312
ОС: Gentoo

Re: Генерация псевдо-случайных чисел на Си в определенных пределах

Сообщение Kasper_WPS »

Код: Выделить всё

 int x = 0 + rand() % (2+1-0);

Это от 0 до 2х не ну я понимаю что можно и ручками поставить 3, но ведь gcc - это оптимизирующий компилятор, пусть оптимизирует, чтоб не рассляблялся :)
md5 - изврат полный :)
лучше mktime(), правда пока не разобрался как его использовать :wacko:
Gentoo Linux - Stage1 - Core2 Q6600 Quad - 2008.0
Kernel: Gentoo-sources - 2.6.36 GCC 4.5.1
XOrg-server 1.9.2 (NVIDIA-9600GT), KDE4 4.5.4
Спасибо сказали:
Andrew S
Сообщения: 225
Статус: экспериментатор
ОС: Conrad-Gentoo

Re: Генерация псевдо-случайных чисел на Си в определенных пределах

Сообщение Andrew S »

А я обычно читал случайные числа из /dev/srandom. К тому же это и под виндой можно сделать: подключить диск самбы и оттуда читать :)))))
Спасибо сказали:
Аватара пользователя
uptime
Сообщения: 1661
Статус: Drinker with computing problems
ОС: kubuntu 8.04

Re: Генерация псевдо-случайных чисел на Си в определенных пределах

Сообщение uptime »

randx = time*10000; /* Чем больше число, тем случайнее зерно */


умиляет. :D

метод повышения энтропии путем умножения на константу...
The answer, my friend, is blowin' in the wind.
The answer is blowin' in the wind.
Спасибо сказали:
Аватара пользователя
Kasper_WPS
Сообщения: 312
ОС: Gentoo

Re: Генерация псевдо-случайных чисел на Си в определенных пределах

Сообщение Kasper_WPS »

uptime писал(а):
20.01.2007 13:09
randx = time*10000; /* Чем больше число, тем случайнее зерно */


умиляет. :D

метод повышения энтропии путем умножения на константу...


Да, исправил :) Не я писал. Мало разбераюсь пока. mktim() - вообще не то :)
Баловался вот так

Код: Выделить всё

printf("%i\n",(double)clock());

Число конечно каждый раз новое, но я так и не понял почему такое происходит :) Так все-таки, как генерировать псевдослучайное число? С time() не подходит, в секунду может быть по 3 запуска приложения.
Gentoo Linux - Stage1 - Core2 Q6600 Quad - 2008.0
Kernel: Gentoo-sources - 2.6.36 GCC 4.5.1
XOrg-server 1.9.2 (NVIDIA-9600GT), KDE4 4.5.4
Спасибо сказали:
Аватара пользователя
aLexx programmer
Сообщения: 985
Статус: Турук-Макто
ОС: Gentoo -> Ubuntu

Re: Генерация псевдо-случайных чисел на Си в определенных пределах

Сообщение aLexx programmer »

(Kasper_WPS @ Jan 20 2007, в 15:26) писал(а):Число конечно каждый раз новое, но я так и не понял почему такое происходит

Потому что

Код: Выделить всё

The clock() function returns an approximation of processor time used by the program.


(Kasper_WPS @ Jan 20 2007, в 15:26) писал(а):С time() не подходит, в секунду может быть по 3 запуска приложения.

Считай зерно из /dev/urandom :)
Спасибо сказали:
Аватара пользователя
Kasper_WPS
Сообщения: 312
ОС: Gentoo

Re: Генерация псевдо-случайных чисел на Си в определенных пределах

Сообщение Kasper_WPS »

aLexx programmer писал(а):
20.01.2007 16:07
Считай зерно из /dev/urandom :)

А это устройство во FreeBSD есть? Извините просто нет возмжности проверить. У меня под Gentoo точно нет :(
Gentoo Linux - Stage1 - Core2 Q6600 Quad - 2008.0
Kernel: Gentoo-sources - 2.6.36 GCC 4.5.1
XOrg-server 1.9.2 (NVIDIA-9600GT), KDE4 4.5.4
Спасибо сказали:
Аватара пользователя
aLexx programmer
Сообщения: 985
Статус: Турук-Макто
ОС: Gentoo -> Ubuntu

Re: Генерация псевдо-случайных чисел на Си в определенных пределах

Сообщение aLexx programmer »

(Kasper_WPS @ Jan 20 2007, в 18:31) писал(а):У меня под Gentoo точно нет

Ээээ, в ядре поддержку включи :)
Спасибо сказали:
Аватара пользователя
Kasper_WPS
Сообщения: 312
ОС: Gentoo

Re: Генерация псевдо-случайных чисел на Си в определенных пределах

Сообщение Kasper_WPS »

aLexx programmer писал(а):
20.01.2007 19:47
(Kasper_WPS @ Jan 20 2007, в 18:31) писал(а):
У меня под Gentoo точно нет

Ээээ, в ядре поддержку включи :)

Ты же знаешь мой следующий вопрос, намекну, а где? Реализовал так как хотел, подсмотрел в исходники php, не по спортивному, но хоть что-то :D

Код: Выделить всё

#include <sys/time.h> // gettimeofday, struct timeval tp

struct timeval tp = {0};
gettimeofday (&tp,NULL);
srand ((unsigned int) (tp.tv_sec+tp.tv_usec));

Всем большое спасибо :)
Gentoo Linux - Stage1 - Core2 Q6600 Quad - 2008.0
Kernel: Gentoo-sources - 2.6.36 GCC 4.5.1
XOrg-server 1.9.2 (NVIDIA-9600GT), KDE4 4.5.4
Спасибо сказали: