Хочу генератор случайных чисел

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Хочу генератор случайных чисел

Сообщение tyomitch » 06.01.2005 (Чт) 5:11

Сабж с Гауссовским распределением.
Сделал по-лобовому:
Код: Выделить всё
Private Function n() As Single
n = Sqr(-2 * Log(Rnd)) * Sc
If Rnd < 0.5 Then n = -n
End Function

(Sc - масштабный коэффициент).
Так вот, почему-то не работает, а именно не выдаёт маленьких (близких к 0) чисел. Хотя именно их он должен выдавать с наибольшей вероятностью. Поведение вдали от 0 похоже на правильное.

Формулу многократно проверял, но там негде ошибиться. Может, я чего-то не учёл? Может, Rnd не равномерное распределение даёт?
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 06.01.2005 (Чт) 6:38

Не похоже оно там на правильное...

Код: Выделить всё
Option Explicit

Private Const SC As Long = 200

Private Sub Form_DblClick()
  Dim i As Long, n1 As Long, v(-SC * SC To SC * SC) As Single, max As Long
 
  Randomize Timer
 
  Me.Cls
  For i = 1 To 1000000
    n1 = CLng(n)
    v(n1) = v(n1) + 1
    If v(n1) > max Then max = v(n1)
  Next
 
  'Ордината
  Me.Line (Me.ScaleWidth / 2, 0)-(Me.ScaleWidth / 2, Me.ScaleHeight)
  'Абсцисса суть нижний край формы.
 
  For i = 0 To Me.ScaleWidth / 2
    Me.PSet (i + Me.ScaleWidth / 2, Me.ScaleHeight * (1 - v(i) / max))
    Me.PSet (Me.ScaleWidth / 2 - i, Me.ScaleHeight * (1 - v(-i) / max))
  Next
End Sub

Private Function n() As Single
  n = Sqr(-2 * Log(Rnd)) * SC
  If Rnd < 0.5 Then n = -n
End Function

Private Sub Form_Load()
  Me.Show
  Me.ScaleMode = vbPixels
  Me.Width = Me.ScaleX(900, vbPixels, vbTwips)
  Me.Height = Me.ScaleY(650, vbPixels, vbTwips)
End Sub
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение tyomitch » 06.01.2005 (Чт) 18:09

Телепат GSerg практически полностью воспроизвёл мой собственный исходник, которым я и проверял мою функцию на правильность :-) :lol:
То, что она в процитированном здесь виде неправильная - это я и сам знаю.
А как правильно-то?
Изображение

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

Сообщение tyomitch » 06.01.2005 (Чт) 21:46

Всё, придумал:
Код: Выделить всё
Private Function n() As Single
n = (Rnd + Rnd + Rnd + Rnd + Rnd + Rnd + Rnd + Rnd - 4) * Sc
End Function

Матчасть рулит :-)
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.01.2005 (Вт) 9:14

Кто ж так делает?
А разбавить Rnd Randomize'ми?
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение tyomitch » 11.01.2005 (Вт) 9:49

alibek писал(а):Кто ж так делает?
А разбавить Rnd Randomize'ми?
Зачем там Randomize-ы? :-?
Одного в самом начале проги - ведь достаточно?
Изображение


Вернуться в Visual Basic 1–6

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

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

    TopList  
cron