Форум программистов, компьютерный форум CyberForum.ru

Генерация случайных чисел типа double во всем диапазоне - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 41, средняя оценка - 4.80
Peek-a-boo
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 4
25.03.2011, 14:32     Генерация случайных чисел типа double во всем диапазоне #1
Нужна помощь в написании программы, генерирующей псевдослучайные числа типа double на всем диапазоне, используя функцию rand().
Я пытался реализовать это, заполняя отдельно каждый из восьми байт случайными числами:
Код
#include "stdio.h"
#include "stdlib.h"
int main()
{
	double x;
        int seed;
	int *px;
	px=(int*)&x;
        scanf ("%i",seed);
	srand(seed);
	*px=rand()%256+(rand()%256)*(1<<8)+(rand()%256)*(1<<16)+(rand()%256)*(1<<24)+(rand()%256)*(1<<32)+(rand()%256)*(1<<40)+(rand()%256)*(1<<48)+(rand()%256)*(1<<56);
	printf ("%lf", x);printf("\n");
	return 0;
}
Независимо от значения seed всегда выводится чилсо вида:
-92559598516065116000000000000000000000000000000000000000000000000000.000000
Также нужно сделать проверку на получение Not a Number'а - насчет этого у меня вообще никаких идей нет.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dmitry_gdv
 Аватар для Dmitry_gdv
64 / 64 / 5
Регистрация: 18.03.2010
Сообщений: 351
25.03.2011, 14:41     Генерация случайных чисел типа double во всем диапазоне #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <cstdlib>
#include <iostream>
#include <ctime>
 
using namespace std;
 
float rnd(int min, int max)
{return min + rand() % (1000*(max-min)) / 1000.0f;}
 
int main(void)
{
    srand(time(NULL));
    const int size = 10;
    float arr[size] = {0};
    for (int i = 0; i < size; i ++)
        arr[i] = rnd(10, 20);
    for (int i = 0; i < size; i ++)
        cout << arr[i] << ' ';
    cout << endl << endl;
    return 0;
}
Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
//Заполнение double массива случайными числами из диапазона [-12 ... 20]
void fill(double arr[], int size)
{
    srand(time(NULL));
    for (int i = 0; i < size; i ++)
        arr[i] = (double)rand() / (double)RAND_MAX * (20 - -12) + -12;
}
Peek-a-boo
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 4
25.03.2011, 15:19  [ТС]     Генерация случайных чисел типа double во всем диапазоне #3
Имелось в виду, что нужно генерировать случайные числа на всем диапазоне double, т.е. от -1.7*10^308 до +1.7*10^308.
Dmitry_gdv
 Аватар для Dmitry_gdv
64 / 64 / 5
Регистрация: 18.03.2010
Сообщений: 351
25.03.2011, 15:28     Генерация случайных чисел типа double во всем диапазоне #4
Цитата Сообщение от Peek-a-boo Посмотреть сообщение
Имелось в виду, что нужно генерировать случайные числа на всем диапазоне double, т.е. от -1.7*10^308 до +1.7*10^308.
и в чём собственно трудность?
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
25.03.2011, 15:31     Генерация случайных чисел типа double во всем диапазоне #5
Peek-a-boo,long long *px;
или же
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "stdio.h"
#include "stdlib.h"
int main()
{
        double x;
        int seed;
        long long *px;
        px=(int*)&x;
        *px = 0;
        for (int i = 0; i < 64; i++)
        {
           *px <<= 1;
           *px |= rand() % 2;
        }
        scanf ("%i",seed);
        srand(seed);
       printf ("%lf", x);printf("\n");
        return 0;
}
Peek-a-boo
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 4
25.03.2011, 16:15  [ТС]     Генерация случайных чисел типа double во всем диапазоне #6
Цитата Сообщение от kazak Посмотреть сообщение
Peek-a-boo,long long *px;
или же
...
А int в строчке px=(int*)&x; тоже менять на long long ?
Если оставить px=(int*)&x; , то не компилируется, а если поменять на long long, то выдает следующее:
http://s009.***********/i309/1103/18/0cbf4d3733d4.jpg
10 случайных чисел. Смущает то, что у большинства после семнадцатой цифры идут сплошные нули (даже при большем количестве генерируемых чисел и при других seed), а также наличие отрицательных нулей.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
25.03.2011, 16:29     Генерация случайных чисел типа double во всем диапазоне #7
Цитата Сообщение от Peek-a-boo Посмотреть сообщение
А int в строчке pa=(int*)&a; тоже менять на long long ?
да, не доглядел просто
Цитата Сообщение от Peek-a-boo Посмотреть сообщение
Смущает то, что у большинства после семнадцатой цифры идут сплошные нули
если память не изменяет, в double может храниться около 16 значащих цифр (под мантиссу отводится 52(один в уме) бита, т.е. максимальное число которое может поместиться в мантиссе будет 2^53, минимальное 2^-53)
Вариант с интом
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int main(int argc, char* argv[])
{
   double num;
   int *pNum = (int*)&num;
   int i, j;
 
   srand(time(NULL));
 
   *pNum = 0;
   for (i = sizeof(double)/sizeof(int); i > 0; i--)
   {
      for (j = sizeof(int)*8; j > 0; j--)
      {
         *pNum <<= 1;
         *pNum |= rand() % 2;
      }
      pNum++;
   }
   if ((i = sizeof(double)% sizeof(int)) != 0)
   {
      for (i *= 8; i > 0; i--)
      {
         *pNum <<= 1;
         *pNum |= rand() % 2;
      }
   }
   printf("%e\n", num);
   system("pause");
   return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2011, 16:51     Генерация случайных чисел типа double во всем диапазоне
Еще ссылки по теме:

генерация рандомных чисел в диапазоне C++
Генерация случайных чисел в диапазоне 0 - 1 C++
C++ Генерация случайных чисел

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Peek-a-boo
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 4
25.03.2011, 16:51  [ТС]     Генерация случайных чисел типа double во всем диапазоне #8
kazak, Большое спасибо.
Yandex
Объявления
25.03.2011, 16:51     Генерация случайных чисел типа double во всем диапазоне
Ответ Создать тему
Опции темы

Текущее время: 02:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru