генератор случайных чисел (random)

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

генератор случайных чисел (random)

Сообщение lord0n » 04.07.2007 (Ср) 12:33

Коллеги, доброго времени суток.
Просьба не кидаться тухлыми помидорами и не отсылать в поиск.
Был, смотрел - того что нужно нету :(

Проблема такая: пишу функцию для генерации случайного имени файла (длинна имени 20 символов).
Когда прогоняешь функцию в отладке, все просто зашибись.
Имя генерируется, файл создается.
Но когда запускаешь без отладки, имя получается что то из серии "HHHHHHHHHHHHHH" или "ххххххххххххххх"
То есть при вызове функции рендом она генерирует одно и тоже число.
Вот код функции:
Код: Выделить всё

   Private Function GetRND() As Integer
      Dim Rend1 As New System.Random
      Dim MinValue As Integer = 48
      Dim MaxValue As Integer = 126

      Dim x As Integer = Rend1.Next(MinValue, MaxValue)
      System.Windows.Forms.Application.DoEvents()
      Return x
   End Function
Теория - это когда что-то не работает и известно почему.
Практика - это когда что-то работает, но неизвестно почему.
Нам удалось совместить теорию с практикой, теперь ничего не работает и неизвестно почему.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.07.2007 (Ср) 12:43

Dim Rend1 As New System.Random замени на Static Rend1 As New System.Random
(пишу по памяти, мог подзабыть синтаксис)
Изображение

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 04.07.2007 (Ср) 12:53

tyomitch писал(а):Dim Rend1 As New System.Random замени на Static Rend1 As New System.Random
(пишу по памяти, мог подзабыть синтаксис)


О, блин.
Заработало))))))))))))))))
Спасибо огромное
А в чем между ними разница?
Теория - это когда что-то не работает и известно почему.
Практика - это когда что-то работает, но неизвестно почему.
Нам удалось совместить теорию с практикой, теперь ничего не работает и неизвестно почему.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 04.07.2007 (Ср) 17:34

разница в том, что твой вариант при каждом входе в функцию создавал объект класса Rаndom заново, соответственно и последовательность случайных чисел начиналась заново. В варианте со Stаtic объект будет создан один раз при первом входе в функцию.
Весь мир матрица, а мы в нем потоки байтов!

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 04.07.2007 (Ср) 21:32

На самом деле истинный корень зла - конструктор без параметров.
Этот конструктор внутри себя вызывает конструктор с одним параметром:
Код: Выделить всё
Public Sub New()
    Me.New(Environment.TickCount)
End Sub

TickCount возвращает время в милисекундах. Отсюда нормальная работа в Debug-режиме(медленнее работает) и глюк в release. Но это уже зависит от компа. У меня видимо помощнее, поэтому "глючит" даже в debug.
Причем такие "матрешки" из конструкторов используются фреймворком сплошь и рядом, поэтому во избежании подобных непоняток лучше использовать конструкторы с параметрами.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 05.07.2007 (Чт) 8:44

2 Nord777

Понял.
Спасибо за совет

2 Viper
Спасибо, буду знать
Теория - это когда что-то не работает и известно почему.
Практика - это когда что-то работает, но неизвестно почему.
Нам удалось совместить теорию с практикой, теперь ничего не работает и неизвестно почему.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 05.07.2007 (Чт) 10:49

Nord777, создавать новый экземпляр генератора при каждом входе -- в любом случае ересь, даже с явно переданным параметром.
Изображение

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 05.07.2007 (Чт) 12:59

tyomitch
Это понятно, я же не отговаривал человека от предыдущих советов. Просто обьяснил суть происходящего.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 74

    TopList