std ::iform_int_distribution <int>диапазон в g ++ и msvc - PullRequest
1 голос
/ 16 октября 2011

Выполняя небольшой школьный проект, я только заметил разницу в диапазоне std::uniform_int_distribution<int>:

При использовании g ++ диапазон составляет [a, b], однако при использовании msvc (Visual Studio 2010)диапазон (a, b], поэтому вывод следующей программы:

#include <iostream>
#include <random>

using std::cout;
using std::cin;

int main()
{
    std::mt19937 random;
    std::uniform_int_distribution<int> intDist(-1, 1);

    for(int i = 0; i < 100; i++)
    {
        cout << intDist(random) << "\n";
    }

    cin.get();
}

будет отображать -1 в какой-то момент при использовании g ++, но никогда не будет отображать -1 при использовании msvc.

Я знаю, что такие различия существуют между компиляторами, но в документации MSDN и стандартной отметке, что диапазон должен быть [a, b].

В чем причина такого поведения?

Ответы [ 3 ]

4 голосов
/ 12 февраля 2012

Это ошибка в реализации Visual Studio 2010 std::uniform_int_distribution.

Я сообщил об этом здесь в декабре 2011 года и получил подтверждение от Стефана Т. Лававея, что:

  1. Это действительно ошибка.
  2. Это было исправлено в следующей версии Visual Studio (включая текущую Developer Preview ).

Ошибка возникает, когда первый параметр конструктора std::uniform_int_distribution отрицательный. Чтобы обойти это в вашем примере, создайте дистрибутив следующим образом:

std::uniform_int_distribution<int> intDist(0, 2);

А затем назовите это так:

cout << intDist(random) - 1 << "\n";  
0 голосов
/ 17 октября 2011

MSDN говорит :

Оператор первого члена использует двигатель eng в качестве источника равномерно распределенных интегральных значений и возвращает интегральные значения с каждым значением i в замкнутом диапазоне [min (), max ()], встречающимся с равной вероятностью, и значениями вне этого диапазона с вероятностью 0.

Это означает, что ваше наблюдение неверно или в реализации есть ошибки. Это должно быть легко увидеть в источнике.

Я также предлагаю посеять значение rng на другое значение. Существует очень и очень низкая вероятность того, что поведение станет лучше.

0 голосов
/ 17 октября 2011

В чем причина такого поведения?

Если true, это ошибка в реализации MSVC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...