Слишком быстрый Random (C#)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by skivan, 7 Apr 2010.

  1. skivan

    skivan Member

    Joined:
    7 Sep 2006
    Messages:
    13
    Likes Received:
    7
    Reputations:
    8
    Всем привет.

    Есть вот такой код на C#:
    Code:
                 int i = 0;
                while(i<trackBar1.Value)
                {
                Random r = new Random();
                listBox1.Items.Add(r.Next());
                          i++;
                }
    
    Если его выполнить то строчки которые добавляются в ListBox будут одинаковые.

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

    Далее если модифицировать код:
    Code:
                int i = 0;
                while(i<trackBar1.Value)
                {
                       Thread.Sleep(100);
                       Random r = new Random();
                       listBox1.Items.Add(r.Next());
                       i++;
                }
    
    Тоже становить нормально.

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

    noxjoker Member

    Joined:
    7 Aug 2009
    Messages:
    189
    Likes Received:
    24
    Reputations:
    0
    Code:
    int i = 0;
                Random r = new Random();
                while (i < 10)
                {
                    Console.WriteLine(r.Next());
                    i++;
                }
     
  3. skivan

    skivan Member

    Joined:
    7 Sep 2006
    Messages:
    13
    Likes Received:
    7
    Reputations:
    8
    Спасибо. А почему так происходит ?
     
  4. noxjoker

    noxjoker Member

    Joined:
    7 Aug 2009
    Messages:
    189
    Likes Received:
    24
    Reputations:
    0
    Код не логичный.
    Ты в цикле делаешь екземпляр класса. Это не правильно.
     
  5. skivan

    skivan Member

    Joined:
    7 Sep 2006
    Messages:
    13
    Likes Received:
    7
    Reputations:
    8
    И блин, ведь не ругается, работает :)
     
  6. noxjoker

    noxjoker Member

    Joined:
    7 Aug 2009
    Messages:
    189
    Likes Received:
    24
    Reputations:
    0
    Почитай что такое классы.

    Не по теме:

    Code:
    int i = 0;
                while (i < 10)
                {
                    int c=i;
                    i++;
                }
    Вот видишь код не логичный я int c делаю в цикле. А нужно было его вынести за цикл. Это с опытом придет.
     
  7. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    выносить переменных за пределы цикла далеко не всегда логично.
    опу следует прочитать про ГПСЧ и способы его реализации, чтобы понять глубинные причины сего бага. Тут все утыкается в данные, которыми инициализируется рандом. Главная задача генератора - получить уникальное начальное значение, из которого потом генерятся остальные, юзая функцию с равномерным распределением получаемых величин.
    Ну или на худой конец стоит доки почитать об этом классе. Там все расписано, как юзать, когда создавать, какой основной способ получения данных(именно Next, а не порождение новых объектов).
     
  8. scrat

    scrat кодер

    Joined:
    8 Apr 2007
    Messages:
    625
    Likes Received:
    541
    Reputations:
    3
    с чего ему ругаться? Тут надо просто подумать о том, сколько раз у тебя выполнится инициализация Random'а, и нужно ли оно тебе.