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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 42, средняя оценка - 4.88
pigah
12 / 12 / 2
Регистрация: 05.07.2009
Сообщений: 147
Записей в блоге: 1
#1

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

03.08.2009, 01:22. Просмотров 6272. Ответов 13
Метки нет (Все метки)

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

Генерация случайных чисел - C++
Доброго времени суток ! Как генерировать случайное число например в диапазоне от 1 до 52 а потом исключить это число, и генерировать...

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

генерация случайных чисел - C++
Написать программу, которая должна обеспечить исчисление количества повторений заданного числа по модулю 100. Характеристика должна быть...

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

генерация случайных чисел - C++
полазил по форумам, понял что лучшей конструкцией для ввода случайных чисел является: srand(time(NULL)); ... int r =...

Генерация случайных чисел С++ - C++
сгенерировать вещественные числа от 0 до 1(например,0,1;0,2;1,0; и т.д.) в этом случае выводит только 0 и 1: #include&lt;stdio.h&gt; ...

13
Gravity
564 / 558 / 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);
    }
}
Но без диапазона.
1
pigah
12 / 12 / 2
Регистрация: 05.07.2009
Сообщений: 147
Записей в блоге: 1
03.08.2009, 02:13  [ТС] #3
нужен диапазон без него это не то
0
Monte-Cristo
2790 / 1376 / 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 может существовать аналогичный тип)
1
odip
Эксперт С++
7159 / 3221 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
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
0
novi4ok
551 / 504 / 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;
}
, но намного понятней код это не сделает.
2
mamedovvms
2918 / 839 / 93
Регистрация: 30.04.2009
Сообщений: 2,633
03.08.2009, 16:31 #7
а для какой цели генерируются такие большие числа????
0
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;
}
0
odip
Эксперт С++
7159 / 3221 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
03.08.2009, 19:34 #9
у меня работает такой код:
Работать он может и работает, но случайные числа будут находиться очень близко от числа A.
Потому что rand() выдает значения от 0 до RAND_MAX.
0
CheshireCat
Эксперт С++
2896 / 1245 / 78
Регистрация: 27.05.2008
Сообщений: 3,405
03.08.2009, 22:07 #10
Что мешает использовать boost::random ?

Насчет "вообще int64_t - это стандартный тип" - не соглашусь, это стандартный тип для C99, но не для С++03. В С++09 уже законным образом появятся long long int и unsigned long long int, хотя по факту они уже поддерживаются популярными компиляторами.
0
odip
Эксперт С++
7159 / 3221 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
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.
0
Rififi
2360 / 1053 / 44
Регистрация: 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();
2
odip
Эксперт С++
7159 / 3221 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
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).
0
bambarmia
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 2
13.03.2010, 18:05 #14
Цитата Сообщение от odip Посмотреть сообщение
...
Нужно либо генерировать случайное число кусками по 10000 ( Gravity сделал по 10 ).
Либо брать собственный алгоритм генерации псевдослучайных чисел.
Причем такой, чтобы генерировать достаточно большой диапазон.
...
Генерация кусками не подходит, ведь в идеале кусок один должен быть.
Поэтому, расскажите, пожалуйста, подробнее, или скажите где почитать про такой алгоритм, как cгенерировать самому большой диапазон?
0
13.03.2010, 18:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.03.2010, 18:05
Привет! Вот еще темы с ответами:

Генерация случайных чисел - C++
Здравствуйте, появилась такая проблема: при генерации случайного числа функцией rand(); мне нужно сгенерировать 5 случайных чисел, но...

Генерация случайных чисел - 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++
Подскажите пожалуйста правильно ли я осуществил перевод строк из С в С++, сомневаюсь С - randomize(); С++ - srand(NULL); С ...


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

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

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