более 1 последовательности случайных чисел c #, linq - PullRequest
0 голосов
/ 04 декабря 2010

Я использовал этот код для генерации случайной последовательности чисел:

var sequence = Enumerable.Range(0, 9).OrderBy(n => n * n * (new Random()).Next());

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

        int i = 0;
        while (i<10)
        {
            Console.Write("{0}:",i);
            var sequence = Enumerable.Range(0, 9).OrderBy(n => n * n * (new Random()).Next());
            sequence.ToList().ForEach(x=> Console.Write(x));
            i++;
            Console.WriteLine();
        }

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

Ответы [ 3 ]

5 голосов
/ 04 декабря 2010

Проблема в том, что вы создаете новый экземпляр Random на каждой итерации. Каждый экземпляр будет получать свое начальное начальное значение с текущего времени, которое изменяется относительно редко по сравнению с тем, как часто выполняется ваш делегат. Вы можете создать единственный экземпляр Random и использовать его повторно. См. Мою статью о случайности для более подробной информации.

Тем не менее, я бы также предложил, чтобы вы использовали Fisher-Yates shuffle вместо OrderBy, чтобы перемешать значения (существует множество примеров переполнения стека, например один ) ... хотя похоже, что вы пытаетесь несколько сместить случайность. Если бы вы могли предоставить более подробную информацию о точно о том, что вы пытаетесь сделать, мы могли бы помочь больше.

2 голосов
/ 04 декабря 2010

Вы создаете 10 экземпляров Random в быстрой последовательности и извлекаете первое псевдослучайное число из каждого из них.Я не удивлен, что они все одинаковые.

Попробуйте это:

Random r = new Random();
var sequence = Enumerable.Range(0, 9).OrderBy(n => n * n * r.Next());
0 голосов
/ 04 декабря 2010

В своем коде я использую этот статический метод, который я написал много лет назад, и он все еще показывает хорошую рандомизацию:

using System.Security.Cryptography;
...

public static int GenerateRandomInt(int from, int to)
{
  byte[] salt = new byte[4];
  RandomNumberGenerator rng = RandomNumberGenerator.Create();
  rng.GetBytes(salt);
  int num = 0;
  for (int i = 0; i < 4; i++)
  {
    num += salt[i];
  }
  return num % (to + 1 - from) + from;
}

Не могу объяснить этот пример подробно, мне нужно вернуться назад, чтобы вспомнить, но мне все равно;)

...