2017-02-07 10 views
1

Я написал генератор случайных чисел, используя srand(), который создает массив случайных чисел заданного размера. Я хотел бы, чтобы мои случайные числа принимали значения до 1000 000, и чтобы получить это, я определил каждую запись массива как rand()%1000000 в коде ниже. Странно, что случайные значения составляют около 30 000, а более крупные случайные числа, такие как 987,623, не создаются, т. Е. Число цифр случайных чисел не превышает 5. Кто-нибудь имеет представление о том, почему это происходит? Есть ли другой способ (функция), который вы можете предложить, чтобы получить случайные числа, большие, чем эти?Почему размер цифр генератора случайных чисел ограничен?

#include <iostream> 
#include <fstream> 
#include <stdlib.h> 
#include <time.h> 
#include <cmath> 
#include <vector> 
using namespace std; 

int * rng(int size) { 
    int* a = NULL; 
    a = new int[size]; 
    for (int i = 0; i < size; i++) { 
     a[i] = rand() % 1000000; 
     if (a[i] == 0) { 
      a[i] += 1; 
     } 
    } 
    for (int j = 0; j < size; j++) { 
     cout << a[j] << " "; 
    } 
    delete[] a; 
    a = NULL; 
    return a; 
} 

int main() { 
    srand(time(NULL)); 
    int size; 
    int* x; 
    ifstream myfile("size.txt"); 
    ofstream outfile("input.txt"); 
    while (myfile>>size) { 
     x=rng(size); 
     if (outfile.is_open()) {  
      for(int count = 0; count < size; count ++) { 
       outfile<< x[count] << " " ; 
      } 
     myfile.close(); 
     }  
    } 
    return 0; 
    delete [] x; 
    x = NULL; 
} 
+0

В качестве побочного примечания ваш код создает утечки памяти, потому что все, что приходит после 'return a;', не будет выполнено. Используйте отладчик для выполнения кода. –

+0

Спасибо Raw N 5, я исправлю это. – esra

+2

Возможный дубликат [Extend rand() max range] (http://stackoverflow.com/questions/9775313/extend-rand-max-range) –

ответ

6

RAND_MAX на вашей машине, очевидно, близко или, как минимум, допускаемый стандарт: 32767

Есть много альтернатив, доступных, которые предлагают лучшую периодичность. Mersenne Twister - одна из таких хороших альтернатив и является частью стандарта C++ 11.

Также обратите внимание, что заявления после вашего заявления о возврате недоступны. Рассмотрим a

std::vector<int> 

в качестве возвращаемого типа.

+0

Точно, см. Http: //www.cplusplus.com/reference/cstdlib/RAND_MAX/ –

+0

Bathsheba thanks :) – esra

3

According to the documentation, функция rand() возвращает число между 0 и RAND_MAX, который, опять-таки according to the documentation, является от реализации. «Определенная реализация» означает «независимо от того, какой поставщик компилятора хочет, чтобы это было». В этом случае поставщик вашего компилятора решил, что он должен быть примерно 30000, по всей вероятности, 32767, по всей вероятности, чтобы избежать нарушения совместимости с какой-то старой 16-разрядной версией своего компилятора.

Вы можете выбрать другой компилятор, или вы могли бы сделать некоторые хитрости, как следующее:

int my_random_number = rand()^(rand() << 15); 

так выше предполагается, что rand() функции имеет 15-битный диапазон (это число от 0 до 32767) он объединяет 15 бит от одного вызова с еще 15 битами от другого вызова, давая в общей сложности 30 бит, который имеет диапазон, намного превышающий нулевой уровень от 0 до 1.000.000. Эта конкатенация достигается путем сдвига результата второго вызова влево на 15 бит, а затем XORing вместе два результата.

+0

Спасибо. Я использую Dev C++, попробую другие. – esra

+0

«Реализация, определенная» означает, что автор компилятора может решить, что делает реализация, ** в соответствии с ограничениями ** в стандарте. Для 'RAND_MAX' ограничение состоит в том, что его значение должно быть не менее 32767.« Реализация, определенная »также означает, что реализация ** должна документировать ** ее поведение. –

+0

Майк, вы можете немного объяснить трюк? вы меняете его? – esra