System.Random продолжает возвращать одно и то же значение - PullRequest
9 голосов
/ 17 ноября 2008

Я использую объект System.Random, который создается с фиксированным начальным числом во всем приложении. Я вызываю метод NextDouble и по прошествии некоторого времени я получаю 0.0 как результат.

Есть ли какое-нибудь средство от этого, кто-нибудь еще сталкивался с этим?

РЕДАКТИРОВАТЬ: У меня есть одно семя для всего цикла, который для удобства установлен на 1000. Random.NextDouble вызывается несколько сотен тысяч раз. Это приложение-оптимизатор, которое может работать в течение пары часов, но на самом деле это происходит через 10–0 минут выполнения. Недавно я добавил в приложение немного больше случайных звонков.

Ответы [ 5 ]

17 голосов
/ 17 ноября 2008

Генератор случайных чисел в .NET не является потокобезопасным. Другие разработчики заметили такое же поведение, и одно решение выглядит следующим образом (от http://blogs.msdn.com/brada/archive/2003/08/14/50226.aspx):

class ThreadSafeRandom
{
    private static Random random = new Random();

    public static int Next()
    {
       lock (random)
       {
           return random.Next();
       }
    }
}
8 голосов
/ 17 ноября 2008

Как часто вы сеете Рэндом? Это должно быть сделано только один раз в начале программы.

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

2 голосов
/ 17 ноября 2008

Другие люди уже проделали достойную работу, объясняя это и предлагая решения.

В любом случае, на похожий вопрос ранее уже отвечал Эрик , зацените:

Псевдослучайный генератор с тем же выходом

Вы также можете получить дополнительные вопросы и ответы по теме (Генераторы случайных чисел) по адресу:

Генератор случайных чисел Stackoverflow.com

Gene

P.S. Это просто дополнение к принятому ответу.

2 голосов
/ 17 ноября 2008

Томас, я сталкивался с этой "ошибкой" раньше, и для меня было решение сделать переменную уровня модуля _rnd:

Private Shared _rnd As System.Random()
Public Shared Function RandRange(ByVal low As Integer, ByVal high As Integer) As Integer
    If _rnd Is Nothing Then
        _rnd = New System.Random()
    End If
    Return rnd.Next(low, high)
End Function
1 голос
/ 17 ноября 2008

посмотрите на это http://msdn.microsoft.com/en-us/library/system.random.aspx, это должно объяснить, почему вы получаете такое же значение.

...