Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 41, средняя оценка - 4.80
Peek-a-boo
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 4
#1

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

25.03.2011, 14:32. Просмотров 6499. Ответов 7
Метки нет (Все метки)

Нужна помощь в написании программы, генерирующей псевдослучайные числа типа 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'а - насчет этого у меня вообще никаких идей нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.03.2011, 14:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Генерация случайных чисел типа double во всем диапазоне (C++):

Генерация случайных чисел в диапазоне 0 - 1 - C++
Привет. Прошу помочь с рандомными числами. Нужны числа от 0 или 1

Генерация случайных чисел на заданном диапазоне - C++
Здравствуйте, прошу прощения, если такая тема уже проскакивала. Есть простой генератор чисел (алгоритм Леммера): #include...

Генерация случайных вещественных чисел в диапазоне 0..1 - C++
Какнить можно заставить rand() работать по аналогии в Паскале, т.е. выдавать числа от 0 до 1 (0,000000054, 0,743325235, 0,0052411 и...

Генерация случайных чисел в заданном диапазоне. - C++
Здесь сказано Почему?

Создание массива случайных чисел типа double - C++
Доброго времени суток. В задании требует создать массив случайных чисел типа double. Пока что для простоты работы самой программы...

Запишите шесть строк, состоящих из двух случайных чисел типа int, которые не больше 10 и трех случайных чисел - C++
Запишите шесть строк, состоящих из двух случайных чисел типа int, которые не больше 10 и трех случайных чисел типа float, что не больше...

7
Dmitry_gdv
64 / 64 / 5
Регистрация: 18.03.2010
Сообщений: 353
25.03.2011, 14:41 #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;
}
1
Peek-a-boo
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 4
25.03.2011, 15:19  [ТС] #3
Имелось в виду, что нужно генерировать случайные числа на всем диапазоне double, т.е. от -1.7*10^308 до +1.7*10^308.
0
Dmitry_gdv
64 / 64 / 5
Регистрация: 18.03.2010
Сообщений: 353
25.03.2011, 15:28 #4
Цитата Сообщение от Peek-a-boo Посмотреть сообщение
Имелось в виду, что нужно генерировать случайные числа на всем диапазоне double, т.е. от -1.7*10^308 до +1.7*10^308.
и в чём собственно трудность?
0
kazak
3051 / 2372 / 160
Регистрация: 11.03.2009
Сообщений: 5,437
Завершенные тесты: 1
25.03.2011, 15:31 #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;
}
0
Peek-a-boo
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 4
25.03.2011, 16:15  [ТС] #6
Цитата Сообщение от kazak Посмотреть сообщение
Peek-a-boo,long long *px;
или же
...
А int в строчке px=(int*)&x; тоже менять на long long ?
Если оставить px=(int*)&x; , то не компилируется, а если поменять на long long, то выдает следующее:

10 случайных чисел. Смущает то, что у большинства после семнадцатой цифры идут сплошные нули (даже при большем количестве генерируемых чисел и при других seed), а также наличие отрицательных нулей.
0
kazak
3051 / 2372 / 160
Регистрация: 11.03.2009
Сообщений: 5,437
Завершенные тесты: 1
25.03.2011, 16:29 #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;
}
2
Peek-a-boo
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 4
25.03.2011, 16:51  [ТС] #8
kazak, Большое спасибо.
0
25.03.2011, 16:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2011, 16:51
Привет! Вот еще темы с ответами:

генерация рандомных чисел в диапазоне - C++
Добрый день подскажите (или дайте кусочек кода) как реализовать генерацию рандомных чисел

Генерация случайных чисел - C++
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;clocale&gt; #include &lt;time.h&gt; #include &lt;stdlib.h&gt; using namespace std; int main ()...

Генерация случайных чисел - C++
Мне нужно заполнить множество матриц числами 0 или 1. Для этого использую функцию rand. Но мне необходима совсем случайная...

Генерация случайных чисел - C++
Как в С сгенирировать последовательность случайных чисел от x до y.Например от 1 до 100.


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.