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

генерация очень больших случайных чисел - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 42, средняя оценка - 4.88
pigah
 Аватар для pigah
12 / 12 / 2
Регистрация: 05.07.2009
Сообщений: 147
Записей в блоге: 1
03.08.2009, 01:22     генерация очень больших случайных чисел #1
Пожалуйста помогите мне нужна программа генерирующая числа размером 12 символов
вот мой код :
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
#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <iomanip>
 
using namespace std;
 
const int CP=1251;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    SetConsoleOutputCP(CP);
    const long int N=50;//чисел всего
    const long int A=154017290000,B=954017290000;//границы диапазона случайных чисел        
    long int x[N];//массив
    int i;
    srand(GetTickCount());
    for(i=0; i<N; i++){
        x[i]=A+rand()%(B-A+1);
        cout<<setw(4)<<x[i]<<"\n";
        }
    cout<<"\n\n";
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.08.2009, 01:22     генерация очень больших случайных чисел
Посмотрите здесь:

C++ Генерация случайных чисел
C++ Генерация случайных чисел
C++ генерация случайных чисел
C++ Генерация случайных чисел
C++ Генерация случайных чисел
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Gravity
 Аватар для Gravity
556 / 550 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
03.08.2009, 01:48     генерация очень больших случайных чисел #2
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>
#include <time.h>
#define LEN 12
#define N 10
 
main()
{
    int i, j;
    char num[LEN+1];
 
    srand(time(NULL));
    for(i = 0; i < N; i++) {
        for(j = 0; j < LEN; j++)
            num[j] = rand()%10 + '0';
        num[j] = '\0';
        printf("%s\n", num);
    }
}
Но без диапазона.
pigah
 Аватар для pigah
12 / 12 / 2
Регистрация: 05.07.2009
Сообщений: 147
Записей в блоге: 1
03.08.2009, 02:13  [ТС]     генерация очень больших случайных чисел #3
нужен диапазон без него это не то
Monte-Cristo
 Аватар для Monte-Cristo
2805 / 1370 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
03.08.2009, 02:37     генерация очень больших случайных чисел #4
а в чем компилировали? Visual Studio 2008, например, подсказала: что тип необходимо применять __int64, так как 12циферное число вылазит за пределы long.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <ctime>
#include <iostream>
#include <iomanip>
using namespace std;
 
int main()
{
    const long int N=50;//чисел всего
    const __int64 A=154017290000,B=954017290000;//границы диапазона случайных чисел                
    __int64 x[N];//массив
    int i;
    srand(time(0));
    for(i=0; i<N; i++){
        x[i]=A+rand()%(B-A+1);
        cout<<setw(4)<<x[i]<<"\n";
    }
    cout<<"\n\n";
    return 0;
}

Не по теме:

p.s: 2000 пост кстати



Добавлено через 7 минут 59 секунд
но __int64 не входит в стандарт С++. Он поддерживается компилятором VC++. Если вы используете другой компилятор, то необходимо почитать документацию к нему (там вместо __int64 может существовать аналогичный тип)
odip
Эксперт C++
 Аватар для odip
7225 / 3287 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
03.08.2009, 10:22     генерация очень больших случайных чисел #5
2pigah: Программа не будет работать. (B-A) сильно превышает по размеру RAND_MAX.

Нужно либо генерировать случайное число кусками по 10000 ( Gravity сделал по 10 ).
Либо брать собственный алгоритм генерации псевдослучайных чисел.
Причем такой, чтобы генерировать достаточно большой диапазон.

Добавлено через 9 минут 21 секунду
там вместо __int64 может существовать аналогичный тип
int64_t для gcc

Добавлено через 11 минут 25 секунд
Вообще int64_t - это стандартный тип.
http://en.wikipedia.org/wiki/Stdint.h

Для Visual Studio 2005/2008 есть дополнительный файл stdint.h
http://msinttypes.googlecode.com/svn/trunk/stdint.h
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
03.08.2009, 15:30     генерация очень больших случайных чисел #6
STDLIB.H от microsoft определяет:
#define RAND_MAX 0x7fff

значит максимальное число от rand() будет "два неполных байта". те. мы можем взять оттуда 15 бит только, и нам досаточно 4 раза по 15 бит (может и три раза хватит? если охота знать точно или производительность ОЧЕНЬ критична - просчитайте). тогда запишем такую ф-ю:
C++
1
2
3
4
5
6
7
8
9
10
11
__int64 rand64(){
  __int64 r64 = 0;
  r64=rand();
  r64=r64 << 15;
  r64+=rand();
  r64=r64 << 15;
  r64+=rand();
  r64=r64 << 15;
  r64+=rand();
  return r64;
}
и будем использовать ее вместо rand() в коде Monte-Cristo.
можете цикл организовать:

C++
1
2
3
4
5
6
7
8
9
__int64 rand64(){
  __int64 r64 = 0;
  r64=rand();
    for (int i = 0; i < 3; i++){
    r64=r64 << 15;
    r64+=rand();
  }
  return r64;
}
, но намного понятней код это не сделает.
mamedovvms
2913 / 834 / 93
Регистрация: 30.04.2009
Сообщений: 2,613
03.08.2009, 16:31     генерация очень больших случайных чисел #7
а для какой цели генерируются такие большие числа????
pigah
 Аватар для pigah
12 / 12 / 2
Регистрация: 05.07.2009
Сообщений: 147
Записей в блоге: 1
03.08.2009, 19:27  [ТС]     генерация очень больших случайных чисел #8
у меня работает такой код:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// gen.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <iomanip>
#include <conio.h>
#include <fstream>
 
using namespace std;
 
const int CP=1251;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    SetConsoleOutputCP(CP);
    const __int64 N=1000;//чисел всего
    const __int64 A=154017290000,B=354017290000;//границы диапазона случайных чисел     
    __int64 x[N];//массив
    __int64 m[N];//массив
    int i;
    fstream f("test.txt",ios::out);
    srand(GetTickCount());
    for(i=0; i<N; i++){
        x[i]=A+1+rand()%(B-A+11);
        //cout<<setw(4)<<x[i]<<"\n";
        f<<x[i]<<"\n";
        }
    cout<<"\n\n";
    fstream d("test.txt",ios::app);
    //srand(GetTickCount());
    for(i=0; i<N; i++){
        m[i]=A+1+rand()%(B-A+11);
        //cout<<setw(4)<<x[i]<<"\n";
        d<<m[i]<<"\n";
        }
    fstream h("test.txt",ios::app);
    __int64 y[N];
    //srand(GetTickCount());
    for(i=0; i<N; i++){
        y[i]=A+1+rand()%(B-A+11);
        //cout<<setw(4)<<x[i]<<"\n";
        h<<y[i]<<"\n";
        }
    cout<<"\n\n";
    _getch();
    return 0;
}
odip
Эксперт C++
 Аватар для odip
7225 / 3287 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
03.08.2009, 19:34     генерация очень больших случайных чисел #9
у меня работает такой код:
Работать он может и работает, но случайные числа будут находиться очень близко от числа A.
Потому что rand() выдает значения от 0 до RAND_MAX.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
03.08.2009, 22:07     генерация очень больших случайных чисел #10
Что мешает использовать boost::random ?

Насчет "вообще int64_t - это стандартный тип" - не соглашусь, это стандартный тип для C99, но не для С++03. В С++09 уже законным образом появятся long long int и unsigned long long int, хотя по факту они уже поддерживаются популярными компиляторами.
odip
Эксперт C++
 Аватар для odip
7225 / 3287 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
03.08.2009, 23:35     генерация очень больших случайных чисел #11
2CheshireCat:
int64_t - это тип гарантированно имеющий ровно 64 бита.
long long - я думаю никто не будет гарантировать что sizeof(long long) будет ровно 64 бита.
Так что оба типа могут понадобиться

Добавлено через 9 минут 9 секунд
Стандарт C++0x чего-то обкоцали сильно.

Добавлено через 1 час 15 минут 46 секунд
Популярный генератор псевдослучайных чисел.
SIMD-oriented Fast Mersenne Twister (SFMT).
SFMT генерирует 128-битные целые псевдослучайные числа в один шаг.
dSFMT напрямую генерирует вещественные (double) псевдослучайные числа.
http://www.math.sci.hiroshima-u.ac.j...FMT/index.html

P.S. Добавил в FAQ.
Rififi
 Аватар для Rififi
2330 / 1045 / 43
Регистрация: 03.05.2009
Сообщений: 2,656
04.08.2009, 00:32     генерация очень больших случайных чисел #12
добавь тогда уж и это в faq (где бы он ни был)

Генерация случайного числа любой длинны:
C++
1
2
3
4
5
6
7
8
9
10
#include <Windows.h>
#include <bcrypt.h>
template <typename T>
void Generate(T& v)
{
    BCRYPT_HANDLE hAlgo = NULL;
    BCryptOpenAlgorithmProvider(&hAlgo, BCRYPT_RNG_ALGORITHM, NULL, 0);
    BCryptGenRandom(hAlgo, reinterpret_cast<PUCHAR>(&v), sizeof(v), 0);
    BCryptCloseAlgorithmProvider(hAlgo, 0);
}
Генерация случайных чисел по закону нормального распределения с использованием одного из лучших генераторов псевдо-случайных чисел Mersenne Twister
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
#include <boost/random.hpp>
 
template <typename EngineT>
struct CRandomT
{
    typedef boost::normal_distribution<>::result_type result_type;
    CRandomT(int a, int b) : 
        gen_(
            EngineT(), 
            boost::normal_distribution<>(
                static_cast<result_type>(a),
                static_cast<result_type>(b)))
    {
    };
    result_type get()
    {
        return gen_();
    }
    boost::variate_generator<EngineT, boost::normal_distribution<> > gen_;
};
 
typedef CRandomT<boost::mt19937> CRandom;
CRandom rnd(1, 10);
rnd.get();
odip
Эксперт C++
 Аватар для odip
7225 / 3287 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
04.08.2009, 10:13     генерация очень больших случайных чисел #13
2Rififi: Please выложи под собой в FAQ http://www.cyberforum.ru/cpp-beginners/thread44753.html

Добавлено через 1 минуту 17 секунд
одного из лучших генераторов псевдо-случайных чисел Mersenne Twister
А я там ссылку дал на еще более лучший алгоритм тех же авторов - SIMD-oriented Fast Mersenne Twister (SFMT).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.03.2010, 18:05     генерация очень больших случайных чисел
Еще ссылки по теме:

генерация случайных чисел C++
C++ Генерация случайных чисел
C++ Генерация случайных чисел

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

Или воспользуйтесь поиском по форуму:
bambarmia
Сообщений: n/a
13.03.2010, 18:05     генерация очень больших случайных чисел #14
Цитата Сообщение от odip Посмотреть сообщение
...
Нужно либо генерировать случайное число кусками по 10000 ( Gravity сделал по 10 ).
Либо брать собственный алгоритм генерации псевдослучайных чисел.
Причем такой, чтобы генерировать достаточно большой диапазон.
...
Генерация кусками не подходит, ведь в идеале кусок один должен быть.
Поэтому, расскажите, пожалуйста, подробнее, или скажите где почитать про такой алгоритм, как cгенерировать самому большой диапазон?
Yandex
Объявления
13.03.2010, 18:05     генерация очень больших случайных чисел
Ответ Создать тему
Опции темы

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