Модератор: Модераторы разделов
Kasper_WPS
Сообщения: 312
ОС: Gentoo
Сообщение
Kasper_WPS » 18.01.2007 20:04
Нашел вот здесь:
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
Сообщение
BlackStar » 18.01.2007 21:57
Вот немного попроще:
Код: Выделить всё
#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
Сообщение
Trash » 18.01.2007 22:00
Kasper_WPS, у тебя не заданы границы диапазона a и b.
Вот здесь похоже считывание с файла
uptime = fopen("/proc/uptime","r");
fscanf (uptime,"%f",&time);
Liksys
Сообщения: 2910
Сообщение
Liksys » 18.01.2007 22:23
А что мешает так сделать (в общем случае), рандомизация по 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
Сообщение
Kasper_WPS » 18.01.2007 22:34
Сделал так (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;
}
Спасибо за варианты, посмотрю как Вы реализовали
Большое Спасибо
Еще вопросик появился, как получить 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
Сообщение
aLexx programmer » 18.01.2007 22:40
(Kasper_WPS @ Jan 18 2007, в 22:32) писал(а): srand(t[0] + t[1] + t[2] + t[3]);
Зачем так заморачиваться?
BlackStar
Сообщения: 1338
Статус: We are all Kosh
ОС: Fedora 10
Сообщение
BlackStar » 18.01.2007 22:50
Это еще что... по сравнению с :
int x = 0 + rand() %
(2+1-0) ;
LightLang Team
Liksys
Сообщения: 2910
Сообщение
Liksys » 18.01.2007 22:51
Если хочется чего-нибудь более интересного, то можно посмотреть man 3 md5 . Делаешь хеш для значение time(), складываешь все символы хеша и отдаешь сумму srand()`у.
Kasper_WPS
Сообщения: 312
ОС: Gentoo
Сообщение
Kasper_WPS » 18.01.2007 23:44
Это от 0 до 2х не ну я понимаю что можно и ручками поставить 3, но ведь gcc - это оптимизирующий компилятор, пусть оптимизирует, чтоб не рассляблялся
md5 - изврат полный
лучше mktime(), правда пока не разобрался как его использовать
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
Сообщение
Andrew S » 19.01.2007 10:20
А я обычно читал случайные числа из /dev/srandom. К тому же это и под виндой можно сделать: подключить диск самбы и оттуда читать
))))
uptime
Сообщения: 1661
Статус: Drinker with computing problems
ОС: kubuntu 8.04
Сообщение
uptime » 20.01.2007 13:09
randx = time*10000; /* Чем больше число, тем случайнее зерно */
умиляет.
метод повышения энтропии путем умножения на константу...
The answer, my friend, is blowin' in the wind.
The answer is blowin' in the wind.
Kasper_WPS
Сообщения: 312
ОС: Gentoo
Сообщение
Kasper_WPS » 20.01.2007 15:28
uptime писал(а): ↑ 20.01.2007 13:09
randx = time*10000; /* Чем больше число, тем случайнее зерно */
умиляет.
метод повышения энтропии путем умножения на константу...
Да, исправил
Не я писал. Мало разбераюсь пока. mktim() - вообще не то
Баловался вот так
Число конечно каждый раз новое, но я так и не понял почему такое происходит
Так все-таки, как генерировать псевдослучайное число? С 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
Сообщение
aLexx programmer » 20.01.2007 16:07
(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
Сообщение
Kasper_WPS » 20.01.2007 18:34
А это устройство во 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
Сообщение
aLexx programmer » 20.01.2007 19:47
(Kasper_WPS @ Jan 20 2007, в 18:31) писал(а): У меня под Gentoo точно нет
Ээээ, в ядре поддержку включи
Kasper_WPS
Сообщения: 312
ОС: Gentoo
Сообщение
Kasper_WPS » 20.01.2007 21:48
aLexx programmer писал(а): ↑ 20.01.2007 19:47
(Kasper_WPS @ Jan 20 2007, в 18:31) писал(а):
У меня под Gentoo точно нет
Ээээ, в ядре поддержку включи
Ты же знаешь мой следующий вопрос, намекну, а где? Реализовал так как хотел, подсмотрел в исходники php, не по спортивному, но хоть что-то
Код: Выделить всё
#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