PDA

Просмотр полной версии : Слишком быстрый Random (C#)


skivan
07.04.2010, 15:33
Всем привет.

Есть вот такой код на C#:

int i = 0;
while(i<trackBar1.Value)
{
Random r = new Random();
listBox1.Items.Add(r.Next());
i++;
}


Если его выполнить то строчки которые добавляются в ListBox будут одинаковые.

Однако, если его выполнять пошагово (F11) то все нормально и значения которые добавляются в listbox разные.

Далее если модифицировать код:

int i = 0;
while(i<trackBar1.Value)
{
Thread.Sleep(100);
Random r = new Random();
listBox1.Items.Add(r.Next());
i++;
}


Тоже становить нормально.

Может я где то ошибаюсь ? Или так и надо тормозить процесс ?

noxjoker
07.04.2010, 15:40
int i = 0;
Random r = new Random();
while (i < 10)
{
Console.WriteLine(r.Next());
i++;
}

skivan
07.04.2010, 15:45
Спасибо. А почему так происходит ?

noxjoker
07.04.2010, 15:49
Код не логичный.
Ты в цикле делаешь екземпляр класса. Это не правильно.

skivan
07.04.2010, 16:55
И блин, ведь не ругается, работает :)

noxjoker
07.04.2010, 17:00
Почитай что такое классы.

Не по теме:

int i = 0;
while (i < 10)
{
int c=i;
i++;
}

Вот видишь код не логичный я int c делаю в цикле. А нужно было его вынести за цикл. Это с опытом придет.

Ra$cal
08.04.2010, 02:02
выносить переменных за пределы цикла далеко не всегда логично.
опу следует прочитать про ГПСЧ и способы его реализации, чтобы понять глубинные причины сего бага. Тут все утыкается в данные, которыми инициализируется рандом. Главная задача генератора - получить уникальное начальное значение, из которого потом генерятся остальные, юзая функцию с равномерным распределением получаемых величин.
Ну или на худой конец стоит доки почитать об этом классе. Там все расписано, как юзать, когда создавать, какой основной способ получения данных(именно Next, а не порождение новых объектов).

scrat
08.04.2010, 11:33
И блин, ведь не ругается, работает :)
с чего ему ругаться? Тут надо просто подумать о том, сколько раз у тебя выполнится инициализация Random'а, и нужно ли оно тебе.