Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/54: Рейтинг темы: голосов - 54, средняя оценка - 4.83
12 / 12 / 5
Регистрация: 05.07.2009
Сообщений: 147
Записей в блоге: 1
1

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

03.08.2009, 01:22. Просмотров 10583. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.08.2009, 01:22
Ответы с готовыми решениями:

Генерация случайных чисел
Здравствуйте! Мне нужно сгенерировать случайные числа, много и за секунду или быстрей. Можно ли...

Генерация случайных чисел
Для генерации случайных чисел использую выражение: x = rand() % 4; Библиотеку &lt;cstdlib&gt;...

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

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

13
576 / 570 / 65
Регистрация: 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
12 / 12 / 5
Регистрация: 05.07.2009
Сообщений: 147
Записей в блоге: 1
03.08.2009, 02:13  [ТС] 3
нужен диапазон без него это не то
0
2807 / 1398 / 107
Регистрация: 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
Эксперт С++
7172 / 3230 / 77
Регистрация: 17.06.2009
Сообщений: 14,166
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.c... k/stdint.h
0
554 / 508 / 25
Регистрация: 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
2920 / 841 / 324
Регистрация: 30.04.2009
Сообщений: 2,633
03.08.2009, 16:31 7
а для какой цели генерируются такие большие числа????
0
12 / 12 / 5
Регистрация: 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
Эксперт С++
7172 / 3230 / 77
Регистрация: 17.06.2009
Сообщений: 14,166
03.08.2009, 19:34 9
у меня работает такой код:
Работать он может и работает, но случайные числа будут находиться очень близко от числа A.
Потому что rand() выдает значения от 0 до RAND_MAX.
0
Эксперт С++
2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
03.08.2009, 22:07 10
Что мешает использовать boost::random ?

Насчет "вообще int64_t - это стандартный тип" - не соглашусь, это стандартный тип для C99, но не для С++03. В С++09 уже законным образом появятся long long int и unsigned long long int, хотя по факту они уже поддерживаются популярными компиляторами.
0
Эксперт С++
7172 / 3230 / 77
Регистрация: 17.06.2009
Сообщений: 14,166
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-... index.html

P.S. Добавил в FAQ.
0
MCSD: APP BUILDER
8787 / 1065 / 104
Регистрация: 17.06.2006
Сообщений: 12,604
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
Эксперт С++
7172 / 3230 / 77
Регистрация: 17.06.2009
Сообщений: 14,166
04.08.2009, 10:13 13
2Rififi: Please выложи под собой в FAQ https://www.cyberforum.ru/cpp-... 44753.html

Добавлено через 1 минуту 17 секунд
одного из лучших генераторов псевдо-случайных чисел Mersenne Twister
А я там ссылку дал на еще более лучший алгоритм тех же авторов - SIMD-oriented Fast Mersenne Twister (SFMT).
0
bambarmia
13.03.2010, 18:05 14
Цитата Сообщение от odip Посмотреть сообщение
...
Нужно либо генерировать случайное число кусками по 10000 ( Gravity сделал по 10 ).
Либо брать собственный алгоритм генерации псевдослучайных чисел.
Причем такой, чтобы генерировать достаточно большой диапазон.
...
Генерация кусками не подходит, ведь в идеале кусок один должен быть.
Поэтому, расскажите, пожалуйста, подробнее, или скажите где почитать про такой алгоритм, как cгенерировать самому большой диапазон?
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.03.2010, 18:05

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

Генерация случайных чисел
Доброго времени суток) Задача состоит в том, чтобы заполнить массив произвольными числами....

Генерация случайных чисел С++
сгенерировать вещественные числа от 0 до 1(например,0,1;0,2;1,0; и т.д.) в этом случае выводит...

Генерация случайных чисел
Здрасти. В общем нужно сгенерировать случайное число никак ни связанное с предыдущими числами. При...


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

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

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