Войти

Показать полную графическую версию : Генерирование случайны чисел в С++


Belka007
12-11-2003, 15:29
Существуют ли стандартные функции для генерации случайных чисел типа double в диапазоне от 0 до 1.

Guest
12-11-2003, 18:11
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
И все-же хотелось бы услышать ответ.
Существуют ли стандартные функции для генерации случайных чисел типа double в диапазоне от 0 до 1.

shurikan
18-11-2003, 04:27
bilytur

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

bilytur
19-11-2003, 00:28
shurikan

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

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

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

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

bilytur
21-11-2003, 01:32
shurikan
Имхо чтоб был смысл в использовании __int64 нужно чтоб была функция:
__int64 random(__int64);

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

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

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

shurikan
21-11-2003, 03:47
bilytur
А ты из 4-х с помощью умножений и сложений не можешь сделать __int64???

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

shurikan
22-11-2003, 04:20
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
Если они такие "стандартные", то почему их нет у меня в MSVC++ 6.0 ?
Мелкомягкие забыли включить их в состав ?
Или у каждого производителя  свои "стандарты" ?
Какие "стандартные" функции есть в MSVC++ для генерации случайных чисел различной разрядности?

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

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

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

shurikan
23-11-2003, 22:19
ivank
Оно есть в info libc. Оттуда и цитировал.
:)




© OSzone.net 2001-2012