Показать полную графическую версию : Генерирование случайны чисел в С++
Belka007
12-11-2003, 15:29
Существуют ли стандартные функции для генерации случайных чисел типа double в диапазоне от 0 до 1.
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;
}
И все-же хотелось бы услышать ответ.
Существуют ли стандартные функции для генерации случайных чисел типа double в диапазоне от 0 до 1.
shurikan
18-11-2003, 04:27
bilytur
double R = double(random(0x3FFFFFFF)) / 0x3FFFFFFF;:)
shurikan
Твой способ генерит случайные числа из ограниченного множества не превышающего 0x3FFFFFFF, в то время как всех возможных чисел типа double гораздо больше.
Как я понял стандартных функций для генерации случайных чисел типа double в С нет :(
shurikan
20-11-2003, 03:14
bilytur
Воспользуйся типом __int64, значащими будут 63 разряда - диапазон double перекрыт, т.е. значений гораздо больше, чем влезет в double.
:)
Исправлено: shurikan, 4:15 20-11-2003
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???
Можно конечно и с помощью умножений и сложений...
Можно и вообще свой генератор написать...
Только вопрос был вроде о стандартных функциях.
А их НЕТ.
Точка. :)
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:
Если они такие "стандартные", то почему их нет у меня в MSVC++ 6.0 ?
Мелкомягкие забыли включить их в состав ?
Или у каждого производителя свои "стандарты" ?
Какие "стандартные" функции есть в MSVC++ для генерации случайных чисел различной разрядности?
Это я так. Мысли вслух. Отвечать необязательно.
Ну, если только на последний вопрос. :)
bilytur
Стандартных проме rand функций нет. Возьми генератор откуда-нить из инета - их существует масса готовых, быстрых и дающих при этом достаточный разброс.
shurikan
Это всё изобретения от gcc, в манах об этом должно быть написано, по идее.
shurikan
23-11-2003, 22:19
ivank
Оно есть в info libc. Оттуда и цитировал.
:)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.