Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Генерирование случайны чисел в С++ (http://forum.oszone.net/showthread.php?t=30149)

Belka007 12-11-2003 15:29 207519

Существуют ли стандартные функции для генерации случайных чисел типа double в диапазоне от 0 до 1.

Guest 12-11-2003 18:11 207520

Header File

stdlib.h

Category

Math Routines

Prototype

int random(int num);

Description

Random number generator.

random returns a random number between 0 and (num-1). random(num) is a macro defined in stdlib.h. Both num and the random number returned are integers.

Return Value

random returns a number between 0 and (num-1).
//=========================================

/* random example */
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

/* prints a random number in the range 0 to 99 */
int main(void)
{
   randomize();
   printf("Random number in the 0-99 range: %d\n", random (100));
   return 0;
}

bilytur 17-11-2003 02:10 207521

И все-же хотелось бы услышать ответ.
Цитата:

Существуют ли стандартные функции для генерации случайных чисел типа double в диапазоне от 0 до 1.

shurikan 18-11-2003 04:27 207522

bilytur
Код:


double R = double(random(0x3FFFFFFF)) / 0x3FFFFFFF;

:)

bilytur 19-11-2003 00:28 207523

shurikan

Твой способ генерит случайные числа из ограниченного множества не превышающего 0x3FFFFFFF, в то время как всех возможных чисел типа double гораздо больше.

Как я понял стандартных функций для генерации случайных чисел типа double в С нет :(

shurikan 20-11-2003 03:14 207524

bilytur
Воспользуйся типом __int64, значащими будут 63 разряда - диапазон double перекрыт, т.е. значений гораздо больше, чем влезет в double.
:)

[s]Исправлено: shurikan, 4:15 20-11-2003[/s]

bilytur 21-11-2003 01:32 207525

shurikan
Имхо чтоб был смысл в использовании __int64 нужно чтоб была функция:
__int64 random(__int64);

На самом деле дела обстоят еще хуже:
В MSVC 6 (не знаю как в других) никаких функций random(); randomize(); вообще нет!
Искал в MSDN - нет таких. В Инклудах - тоже нет.

Есть  int rand( void );
Функция rand() возвращает случайное число в диапазоне 0..32767 т.е. фактически short int.

Кстати при таком раскладе даже первый твой пример не прокатывает.

shurikan 21-11-2003 03:47 207526

bilytur
А ты из 4-х с помощью умножений и сложений не можешь сделать __int64???

bilytur 22-11-2003 00:21 207527

Можно конечно и с помощью умножений и сложений...
Можно и вообще свой генератор написать...
Только вопрос был вроде о стандартных функциях.
А их НЕТ.
Точка. :)

shurikan 22-11-2003 04:20 207528

bilytur
Ты что-то путаешь. Есть стандартные алгоритмы генераторов случайных чисел. Да, в них используются целочисленные операнды. Любой алгоритм можно представить для чисел различной разрядности. Если ты будешь реализовывать этот алгоритм для чисел длиной 53 бита, то результат можно рассматривать как мантиссу числа с плавающей точкой. Чем не стандартный алгоритм для чисел типа double? Многоточие... :)


Добавлено:

Да, если говорить о "стандартных" функциях типа rand у Borland-а, то у кого-то их нет. Т.е. эти функции не являются стандартными. Но такие функции всё-таки входят в состав библиотек. Например в GCC в файле stdlib.h (обрати внимание на префикс std - я так думаю, имеется ввиду "стандартная библиотека") есть объявление следующих функций:
Код:


double drand48(void);
double erand48(unsigned short state[3]);
unsigned long lrand48(void);
unsigned long nrand48(unsigned short state[3]);
long mrand48(void);
long jrand48(unsigned short state[3]);
void srand48(long seed);
unsigned short *seed48(unsigned short state_seed[3]);
void lcong48(unsigned short param[7]);

И все они - для работы со случайными числами. Выбирай на вкус.
:oszone:

bilytur 23-11-2003 01:06 207529

Если они такие "стандартные", то почему их нет у меня в MSVC++ 6.0 ?
Мелкомягкие забыли включить их в состав ?
Или у каждого производителя  свои "стандарты" ?
Какие "стандартные" функции есть в MSVC++ для генерации случайных чисел различной разрядности?

Это я так. Мысли вслух. Отвечать необязательно.
Ну, если только на последний вопрос. :)

ivank 23-11-2003 01:29 207530

bilytur
Стандартных проме rand функций нет. Возьми генератор откуда-нить из инета - их существует масса готовых, быстрых и дающих при этом достаточный разброс.

shurikan
Это всё изобретения от gcc, в манах об этом должно быть написано, по идее.

shurikan 23-11-2003 22:19 207531

ivank
Оно есть в info libc. Оттуда и цитировал.
:)


Время: 11:58.

Время: 11:58.
© OSzone.net 2001-