Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Случайные числа


Автор: Drizhenko 19.1.2005, 20:52
Простенький вопрос. Подскажите, пожалуйста, как сделать чтобы при каждом запуке программы (при использовании ф-ии RND) выдавлись новые, отличные от предыдущих случайные числа.

Автор: Gannibal 19.1.2005, 21:01
если хочеш что бы числа генерировались случайно .,, неповторялись при запуске то тебе надо тогда в начале кода прописать РАНДОМИЗЕ ТИМЕР он будет всё время при функции РНД выдавать другие ответы

Автор: cardinal 19.1.2005, 21:49
Смотри здесь:
http://forum.vingrad.ru/index.php?showtopic=33090&view=findpost&p=294164
Подчеркиваю в этом ответе следующее:
Цитата
Еще раз подчеркиваю, что это программа симуляции процессов, то есть она симулирует кликанье юзера (то есть написана она через ж...  smile).

и вот этот кусок кода тоже важен!
Код

one_more_time:
      X = RndInInterval(1, 5)
     
      If X = 1 Or X = 5 Then GoTo one_more_time

Последнее это такая тонкость, которая позволяет получать три разных числа с одинаковой вероятностью.
Просто
Код

Rnd * (RightBorder - LeftBorder) + LeftBorder

это дает конечно числа в интервале [LeftBorder, RightBorder], но с разной вероятностью smile Это такие грабли, на которые я раз наткнулся. Как-нибудь, если время будет сочиню статейку по этому поводу... smile

Автор: Akina 20.1.2005, 10:01
cardinal
У меня всегда код выглядел так:

Код

Public Function Random(Min As Long, Max As Long) As Long
Do
   Random= Rnd * (Max - Min + 2) + Min - 1
Loop While ((Random < Min) Or (Random > Max))
End Function

Кстати, а не поместить ли это в ФАК?

Автор: __Sergey__ 21.1.2005, 02:04
Если так, то значения не будут повторяться
Код

Sub(ByRef arr() as Integer)
Dim i As Integer, tmp As Integer

Randomize
For i = UBound(arr) To LBound(arr) Step -1
  ipos = Int((i - LBound(arr) + 1) * Rnd + LBound(arr))
  tmp = arr(ipos)
  arr(ipos) = arr(i)
  arr(i) = tmp
Next i

End Sub

Автор: cardinal 21.1.2005, 03:29
Akina, да, похоже на правду smile Но может есть вариант без цикла? Надо подумать... Если что найдешь скажи. Но в FAQ думаю и этот вариант поместить можно. Небольшие тесты показали, что он дает правильный (в смысле с одинаковой вероятностью расбросаные числа) результат.
Добавлено @ 03:29
Цитата(__Sergey__ @ 21.1.2005, 00:04)
Если так, то значения не будут повторяться

То есть? Зачем?

Автор: Akina 21.1.2005, 09:28
Цитата(cardinal @ 21.1.2005, 04:29)
в FAQ думаю и этот вариант поместить можно

Надо его доработать - добавить проверку что Max > Min например...
Добавлено @ 09:32
Цитата(cardinal @ 21.1.2005, 04:29)
может есть вариант без цикла? Надо подумать...

Идея есть - но надо проверить...

Автор: Akina 21.1.2005, 16:34
Готово! Сработало.

Код

Public Function Random(Min As Long, Max As Long) As Long
' Равномерный генератор целых случайных чисел заданного диапазона
  Random = (Rnd * (Max - Min + 1)) Mod (Max - Min + 1) + Min
End Function

Тестировал на выборках
Count=1000000
Min=0
Max=3, 10, 100, 1000

В начало еще можно добавить проверки типа:

Код

If Min >= Max Then
  Random=Min
  Min=Max
  Max=Random
End If
If Min=Max Then Exit Function

Автор: Akina 21.1.2005, 16:45
Полностью так:

Код

Public Function Random(Min As Long, Max As Long) As Long
' Равномерный генератор целых случайных чисел заданного диапазона
' со всеми наворотами
  Random = Min
  If Min = Max Then Exit Function
  If Min > Max Then
     Min = Max
     Max = Random
  End If
  Random = (Rnd * (Max - Min + 1)) Mod (Max - Min + 1) + Min
End Function

Автор: cardinal 21.1.2005, 19:50
Akina, да красиво smile

Автор: Guest 24.1.2005, 21:05
Спасибо. smile

Автор: InfMag 5.2.2005, 06:12
Akina
Че-то я не понял. Почему без randomize?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)