Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Работа Rnd Добавлено: 12.06.12 19:22  

Автор вопроса:  merr
Товарисчи! Еще один детский вопрос.
Подскажите пожалуйста, такую штуку: если в программе используется несколько Rnd-генераторов, а "Randomize" (без значения - ссылка на системный таймер)ставить только в одной из процедур, то оно не будет "видно" в другой? А если в одной процедуре несколько Rnd, то на все ли оно будет действовать?

Ответить

  Ответы Всего ответов: 10  

Номер ответа: 1
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #1 Добавлено: 12.06.12 19:38
будет

Ответить

Номер ответа: 2
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #2
Добавлено: 12.06.12 22:53
вызывай Randomize однократно при запуске программы.

Ответить

Номер ответа: 3
Автор ответа:
 merr



Вопросов: 11
Ответов: 31
 Профиль | | #3 Добавлено: 13.06.12 01:18
Ок, спасибо.
Видимо, генератор в VB6 уж не очень "случайный"... Понимаю, он псевдо, но уж слишком характерные повторяющиеся узоры из пикселей рисует - вроде такого http://www.random.org/analysis/

Ответить

Номер ответа: 4
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #4 Добавлено: 13.06.12 01:52
да вполне нормальный там генератор.

Учти, что Randomize инициализирует генератор значением таймера. И если это делать часто, возникнет ситуация, когда между Randomize'ами значение таймера не успело поменяться, вот тогда-то и будут генерироваться повторяющиеся последовательности.

Делаешь Randomize при запуске программы, этого должно быть достаточно.

Ответить

Номер ответа: 5
Автор ответа:
 Cramper



Вопросов: 15
Ответов: 93
 Профиль | | #5 Добавлено: 13.06.12 15:09
Интрересно бы знать какова функция распеределения этой функции? Скорее всего норамальное.

Ответить

Номер ответа: 6
Автор ответа:
 merr



Вопросов: 11
Ответов: 31
 Профиль | | #6 Добавлено: 13.06.12 23:22
Ок, но в том то и прикол что в разное время (я специально до секунд не измерял) он выдавал картинки, где есть "характерные" элементы. Да, они никогда в точности не повторяются, но в целом похожи...Ладно, может я занудствую, а генератор отличный ;)

По идее, у Rnd-генератора должно быть равномерное распределение, т.е. не как у нормального - повышение частоты значений близких к среднему ("горка" нормального распределения), а просто ровная линия.
Кстати, как часто меняется значение Rnd? Он учитывает время до миллисекунд - т.е. 1000 р/сек, то бишь, 1 кГц?

Ответить

Номер ответа: 7
Автор ответа:
 Cramper



Вопросов: 15
Ответов: 93
 Профиль | | #7 Добавлено: 15.06.12 08:13
Да конечно, должно быть равномерное! Для рисования картинок, наверное сгодится. Но вот если речь пойдет оболее тонких вычислительных экспериментах, то скорее всего лучше написать свой генератор, так будет надежнее.

Ответить

Номер ответа: 8
Автор ответа:
 Mikle



Вопросов: 5
Ответов: 134
 Профиль | | #8 Добавлено: 16.06.12 10:19
Занимаюсь генерацией текстур. Алгоритм близок к шуму Перлина. Обратил внимание, что на текстурах просматривается не запланированный узор. Долго искал причину в алгоритме, а нашел в бейсиковской RND().
Это меня подвигло к разработке более "случайной" ф-ции. Вот результат:
  1.  
  2. Option Explicit
  3. Dim Ri As Double
  4.  
  5. Function Rand() As Single
  6.   Ri = 1.314 * Ri + 1.737
  7.   If Ri > 983732.3456 Then Ri = Ri * 0.3141
  8.   Rand = Ri - Int(Ri)
  9. End Function
  10.  
  11. Sub RandInit(r As Single)
  12.   Ri = r
  13. End Sub


Rand - вместо RND.
RandInit - вместо RANDOMIZE.
Распределении гораздо ровнее, чем у RND и в Native Code работает в 3-4 раза быстрее.
Простой тест:
  1.  
  2. Option Explicit
  3. Dim Ri As Double
  4.  
  5. Function Rand() As Single
  6.   Ri = 1.314 * Ri + 1.737
  7.   If Ri > 983732.3456 Then Ri = Ri * 0.3141
  8.   Rand = Ri - Int(Ri)
  9. End Function
  10.  
  11. Sub RandInit(r As Single)
  12.   Ri = r
  13. End Sub
  14.  
  15. Private Sub Form_Load()
  16.   Me.AutoRedraw = False
  17.   Me.ScaleMode = vbPixels
  18. End Sub
  19.  
  20. Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  21. Dim X1 As Long, Y1 As Long
  22.   If Button = 1 Then
  23.     For Y1 = 0 To Me.ScaleHeight - 1
  24.       For X1 = 0 To Me.ScaleWidth - 1
  25.         Me.PSet (X1, Y1), Rnd * &HFFFFFF
  26.       Next X1
  27.     Next Y1
  28.   Else
  29.     For Y1 = 0 To Me.ScaleHeight - 1
  30.       For X1 = 0 To Me.ScaleWidth - 1
  31.         Me.PSet (X1, Y1), Rand * &HFFFFFF
  32.       Next X1
  33.     Next Y1
  34.   End If
  35. End Sub
  36.  
  37. Private Sub Form_Resize()
  38.   Me.Caption = Me.ScaleWidth
  39. End Sub


Задайте ширину 256. Кликайте по форме и смотрите результат.

Ответить

Номер ответа: 9
Автор ответа:
 merr



Вопросов: 11
Ответов: 31
 Профиль | | #9 Добавлено: 16.06.12 13:31
Mikle, Спасибо!
Просветился про шум Перлина. Интересная штука. У меня другая система - клеточный автомат, для которого нужно инициализировать случайное начальное состояние. Буду экспериментировать...

Ответить

Номер ответа: 10
Автор ответа:
 merr



Вопросов: 11
Ответов: 31
 Профиль | | #10 Добавлено: 02.07.12 00:00
Допер в чем была загогулина! Rnd в цикле. Шляпа :)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам