2013-09-05 3 views
0

Я пытаюсь использовать uniform_real_distribution в C++ для генерации массива случайных чисел. Вот мой кодusing uniform_real_distribution в C++

#include <random> 
#include <iostream> 
#include <vector> 
using namespace std; 

int main() 
{ 
    int max_index = 48655; 
    vector<int> arr; 
    arr.resize(100); 

    std::random_device radm; 
    std::mt19937_64 mt(radm()); 
    std::uniform_real_distribution<> distribution(0, max_index); 

    for(int i = 0; i < 100; i++) 
    { 
     arr[i] = int(distribution(mt)*(max_index-1))%(max_index-1); 
    } 
    return 0 
} 

Проблема заключается в том, хотя я явно указан, что случайное число равномерно распределен в 0 и max_index, есть еще какие-то отрицательные числа в моем массиве. И их значения одинаковы (-2432).

Могу я узнать, что я не так?

Большое спасибо заранее.

EDIT1:

======================================== ======================================

Я боюсь, что многие из ответчиков борются с операцией умножения и модуляции. Это была ошибка, что я уже удалил ее. Но дело в том, что даже это может семантически повлиять на результаты, оно не может заставить генератор дать отрицательные результаты.

+0

Вы уверены, что вы правильно проверите содержимое своего вектора? Это не похоже на то, что ваш код может когда-либо создавать отрицательное число в системах с 32-битным 'int' (который я предполагаю, это то, что у вас есть). Btw, с какой целью выполняют умножение и модуль? –

+0

Самый важный вопрос: почему вы делаете это умножение и модуль по значению в вашем цикле? Каков диапазон значений, который вам нужен, и почему бы вам просто не указать, что в дистрибутиве и что с ним делать? – Blastfurnace

+0

@Blastfurnace Это была ошибка. Я удалил его, так как мне больше не нужно управлять диапазоном. Во всяком случае, суть в том, почему существуют отрицательные значения? – ChangeMyName

ответ

0

Это потому, что (max_index-1)**2 = 2367211716 > 2**31 - 1. Любое значение больше 44136 приведет к переполнению подписанного int при умножении на max_index-1. Это около 9% случайных чисел, которые вы генерируете.

Сделайте свою арифметику длинными до тех пор, пока после операции modulo не избежать этого.

0

все

Спасибо за ваши ответы. Я действительно ценю.

Теперь, я сделал небольшое изменение в моем коде следующим образом

ind[i] = abs(int(distribution(mt))); 

В этом случае есть не появляются более отрицательные значения.

Тем не менее, вопрос по-прежнему остается без ответа: ПОЧЕМУ ЯВЛЯЮТСЯ НЕГАТИВНЫМИ В ПОСЛЕДНЕМ ПОСЛЕ?

+0

Вам действительно нужен абс? – jimifiki

+0

В цикле вы можете распечатать дистрибутив (mt) if (int) (распространение (mt) * (max_index-1)) <0. Это может помочь вам ответить ... – jimifiki

+0

Попытка: double myValue = distribution (mt); if ((int (myValue * (max_index-1))% (max_index-1)) <0) std :: cout << myValue << "" << myValue * (max_index-1) << "" (int (myValue * (max_index-1)) << "" << int (myValue * (max_index-1))% (max_index-1) << std :: endl; Ваш вопрос стоит исследовать ... – jimifiki

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