2013-11-29 2 views
-3

Хорошо, что это довольно новое для C++, и я пытаюсь получить генератор случайных чисел для работы. Общая идея заключается в том, что для циклического вызова случайный генератор каждый раз и помещает случайное число в массив. В основном это работает, только проблема в том, что число не является случайным. Каждый раз он печатает -842150451, что является проблемой.генератор случайных чисел C++

int main() 
{ 
    int *array; 
    int size; 
    cout << "Enter size of array: "; 
    cin >> size; 
    array = new int[size]; 
    for (int x = 0; x < size; x++) 
    { 
     srand (time(NULL)); 
     int randomNumber; 
     randomNumber = rand() % 10000 + 1; 
     randomNumber >> array[x]; 

Это все часть большого алгоритма сортировки, так что я не буду беспокоиться копируя все это, так как это часть проблемы.

+1

Прочтите руководство всех функций, которые вы используете. –

+0

Попробуйте инициализировать srand вне вашей петли. В противном случае вы просто создаете RNG с тем же семенем, поскольку время вряд ли изменится в промежутке времени короткого цикла. – Dweeberly

+1

Нет распечатки цифр в коде, который вы указали. Скорее всего, будет проблема с этим, а не только с srand, поскольку этот код дает разные результаты между прогонами, хотя сгенерированные числа в каждом прогоне одинаковы, и они находятся в ожидаемом диапазоне.Пожалуйста, покажите минимальный пример _working_, который _ показывает проблему_. –

ответ

8

Звонок srand до петли. Он инициализирует генератор на основе текущего времени - если ваш цикл достаточно быстр, вы будете инициализировать его одним и тем же семенем на каждой итерации, следовательно, не будет реальной случайности. Одной инициализации достаточно.

Еще одна проблема, которая указывал @ ThomasPadron-Маккарти в одном из комментариев к вашему вопросу: Вы пытаетесь получить значение в массив с помощью

randomNumber >> array[x]; 

Если вы не перегружать, что оператор , это операция сдвига, которая изменит случайное число, но не сохранит его в массиве. Используйте это, чтобы сохранить его:

array[x] = randomNumber; 
+0

Я полагаю, что «каждый раз» он имел в виду «во всех местах моего массива, когда я его печатаю». – fpw

+0

Он должен иметь: p – keyser

2

Если вы можете, вы должны использовать C++ 11-х <random>. Это совсем не сложно, и прыжки впереди srand() и тому подобное.

#include <random> 

... 

std::mt19937 rng_engine(seed); 
std::uniform_int_distribution<int> dist(min, max); 
array[x] = dist(rng_engine); 

Это несколько многословным, но вы можете упростить последний звонок с std::bind:

auto newrand = std::bind(dist, rng_engine); 
array[x] = newrand(); 

Примечание о случайных чисел двигателей: если вы генерируете некоторые более случайные числа, где-то в ваш код, попробуйте использовать один объект движка (вы можете создать несколько дистрибутивов, даже для разных типов). std::mt19937 хранит 624 32-битных целых числа для сохранения состояния; это примерно 2,5 КБ памяти.

1

Поскольку вы используете C++, почему бы вам не сделать это на C++?

Вот некоторые примеры кода (вы можете Тэйлор этого приложения):

#include <random> 

int main() 
{ 
    // A Mersenne Twister pseudo-random generator: 
    typedef std::mt19937 CppRNG; 

    // Seed the generator: 
    uint32_t seed_val = 0; 
    CppRNG RandomGenerator; 
    RandomGenerator.seed(seed_val); 

    int min = 1; // use your val 
    int max = 50; // use your val 

    std::uniform_int_distribution<uint32_t> uniformMinMax(min, max); 

    int r1 = uniformMinMax(RandomGenerator); 
    int r2 = uniformMinMax(RandomGenerator); 

//... and so on 

return 0; 
} 
1

У вас есть несколько проблем в вашем коде. Один из них - srand, вызываемый на каждой итерации, как объясняется fpw. Но как вы думаете, что делает эта линия?

randomNumber >> array[x]; 

Если вы ожидаете, что скопируйте randomNumber в место в массиве, это не то, что он делает. Вместо этого он сдвигает некоторые бит и отбрасывает результат. Поэтому, когда вы позже распечатываете содержимое массива, они будут неинтеллизированным мусором.

Смежные вопросы