Случайное обнаружение, не настолько случайное

Привет у меня есть некоторые проблемы при генерации случайных чисел с C# Теперь, у меня есть эта функция.

public Color getRandomColor()
{
    Color1 = new Random().Next(new Random().Next(0, 100), new Random().Next(200, 255));
    Color2 = new Random().Next(new Random().Next(0, 100), new Random().Next(200, 255));
    Color3 = new Random().Next(new Random().Next(0, 100), new Random().Next(200, 255));
    Color color = Color.FromArgb(Color1, Color2, Color3);
    Console.WriteLine("R: " + Color1 + " G: " + Color2 + " B: " + Color3 + " = " + color.Name);
    return color;
}

Теперь Вы могли бы заметить, что существует МНОГО Случайных новых () там, это вызвано тем, что я хочу избавиться от вероятности, что это могла быть та же ошибка экземпляра.

Я теперь выполняю эту функцию 8 раз, пару раз. Теперь вот, помещает.

R: 65 G: 65 B: 65 = ff414141
R: 242 G: 242 B: 242 = fff2f2f2
R: 205 G: 205 B: 205 = ffcdcdcd
R: 40 G: 40 B: 40 = ff282828
R: 249 G: 249 B: 249 = fff9f9f9
R: 249 G: 249 B: 249 = fff9f9f9
R: 94 G: 94 B: 94 = ff5e5e5e
R: 186 G: 186 B: 186 = ffbababa

R: 142 G: 142 B: 142 = ff8e8e8e
R: 190 G: 190 B: 190 = ffbebebe
R: 19 G: 19 B: 19 = ff131313
R: 119 G: 119 B: 119 = ff777777
R: 119 G: 119 B: 119 = ff777777
R: 75 G: 75 B: 75 = ff4b4b4b
R: 169 G: 169 B: 169 = ffa9a9a9
R: 127 G: 127 B: 127 = ff7f7f7f

R: 73 G: 73 B: 73 = ff494949
R: 27 G: 27 B: 27 = ff1b1b1b
R: 125 G: 125 B: 125 = ff7d7d7d
R: 212 G: 212 B: 212 = ffd4d4d4
R: 174 G: 174 B: 174 = ffaeaeae
R: 0 G: 0 B: 0 = ff000000
R: 0 G: 0 B: 0 = ff000000
R: 220 G: 220 B: 220 = ffdcdcdc

Поскольку Вы видите, что это не настолько случайно снова, но почему доза это происходит? и как я могу противостоять ему?

9
задан Androme 28 April 2010 в 07:33
поделиться

4 ответа

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

Попробуйте создать уникальный объект Random и несколько раз вызвать функцию .Next () .

public Color getRandomColor()
{
    Random rand = new Random();

    Color1 = rand.Next(rand.Next(0, 100), rand.Next(200, 255));
    Color2 = rand.Next(rand.Next(0, 100), rand.Next(200, 255));
    Color3 = rand.Next(rand.Next(0, 100), rand.Next(200, 255));
    Color color = Color.FromArgb(Color1, Color2, Color3);
    Console.WriteLine("R: " + Color1 + " G: " + Color2 + " B: " + Color3 + " = " + color.Name);
    return color;
}

Взято из документации MSDN по объекту Random :

По умолчанию конструктор без параметров класса Random использует системные часы для генерации своего начального значения, в то время как его параметризованный конструктор может принимать значение Int32 на основе по количеству тактов в текущее время. Однако, поскольку часы имеют конечное разрешение, использование конструктора без параметров для создания различных объектов Random в близкой последовательности создает генераторы случайных чисел, которые производят идентичные последовательности случайных чисел

28
ответ дан 4 December 2019 в 06:16
поделиться

Каждый new Random () засевается текущим временем .

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

Используйте один Random , вызывая .Next () , чтобы получить каждое значение.

Теперь вы можете заметить, что есть МНОГО новых Random (), то есть , потому что я хочу отсеять вероятность того, что это может быть то же самое { {1}} ошибка экземпляра.

Это заблуждение; поток чисел из одного Random распределяется равномерно - были предприняты усилия, чтобы сделать его случайным.

7
ответ дан 4 December 2019 в 06:16
поделиться

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

Попробуйте следующее:

public Color getRandomColor()
{
    var random = new Random();
    Color1 = random.Next(random.Next(0, 100), random.Next(200, 255));
    Color2 = random.Next(random.Next(0, 100), random.Next(200, 255));
    Color3 = random.Next(random.Next(0, 100), random.Next(200, 255));
    Color color = Color.FromArgb(Color1, Color2, Color3);
    Console.WriteLine("R: " + Color1 + " G: " + Color2 + " B: " + Color3 + " = " + color.Name);
    return color;
}
1
ответ дан 4 December 2019 в 06:16
поделиться

Вы последовательно создаете много случайных объектов, что приводит к их заполнению с одинаковой / почти одинаковой меткой времени. Таким образом генерируются случайные числа, но равные среди них.

Попробуйте создать один экземпляр случайного числа и использовать его для всех ваших потребностей в случайном числе.

5
ответ дан 4 December 2019 в 06:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: