ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |
Слишком быстрый Random (C#) |

07.04.2010, 15:33
|
|
Новичок
Регистрация: 07.09.2006
Сообщений: 15
Провел на форуме: 171519
Репутация:
21
|
|
Слишком быстрый 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++;
}
Тоже становить нормально.
Может я где то ошибаюсь ? Или так и надо тормозить процесс ?
|
|
|

07.04.2010, 15:40
|
|
Познающий
Регистрация: 07.08.2009
Сообщений: 85
Провел на форуме: 705829
Репутация:
53
|
|
Код:
int i = 0;
Random r = new Random();
while (i < 10)
{
Console.WriteLine(r.Next());
i++;
}
|
|
|

07.04.2010, 15:45
|
|
Новичок
Регистрация: 07.09.2006
Сообщений: 15
Провел на форуме: 171519
Репутация:
21
|
|
Спасибо. А почему так происходит ?
|
|
|

07.04.2010, 15:49
|
|
Познающий
Регистрация: 07.08.2009
Сообщений: 85
Провел на форуме: 705829
Репутация:
53
|
|
Код не логичный.
Ты в цикле делаешь екземпляр класса. Это не правильно.
|
|
|

07.04.2010, 16:55
|
|
Новичок
Регистрация: 07.09.2006
Сообщений: 15
Провел на форуме: 171519
Репутация:
21
|
|
И блин, ведь не ругается, работает 
|
|
|

07.04.2010, 17:00
|
|
Познающий
Регистрация: 07.08.2009
Сообщений: 85
Провел на форуме: 705829
Репутация:
53
|
|
Почитай что такое классы.
Не по теме:
Код:
int i = 0;
while (i < 10)
{
int c=i;
i++;
}
Вот видишь код не логичный я int c делаю в цикле. А нужно было его вынести за цикл. Это с опытом придет.
|
|
|

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

08.04.2010, 11:33
|
|
Постоянный
Регистрация: 08.04.2007
Сообщений: 853
Провел на форуме: 5812656
Репутация:
1540
|
|
Сообщение от skivan
И блин, ведь не ругается, работает 
с чего ему ругаться? Тут надо просто подумать о том, сколько раз у тебя выполнится инициализация Random'а, и нужно ли оно тебе.
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|