Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Слишком быстрый Random (C#) (https://forum.antichat.xyz/showthread.php?t=194264)

skivan 07.04.2010 15:33

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

Есть вот такой код на 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

Цитата:

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

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


Время: 17:50