Как стать автором
Обновить

Комментарии 7

Недавно передо мной встала задача получить на vb6 большое количество истинно случайных чисел (не надо спрашивать)). Я долго извращался, но в итоге пришел к выводу, что генератор случайных чисел бейсика проще пристрелить. Главная фишка там — как его не перемешивать randomize, но если это делать ОЧЕНЬ часто, то все равно результат будет псевдослучайным, так как зависит от таймера, а он почти не меняется в этом случае.
В результате плюнул, взял 10 мб случайных данных random.org, и уже из него случайно выбирал случайную позицию. Так что даже если эта случайная позиция неслучайна, результат все равно будет корректным.
Я в своё время использовал в VB5 ассемблерные вставки. У меня был алгоритм схожий с показанным 32-битным LCG. На конечной машине — Pentium 4, для которого я даже умел делать оптимизацию для конвейера команд. Получилось хорошо.

За "истинно" случайными числами надо к API операционной системы обращаться. В линуксе — /dev/random, в винде — CryptGenRandom.


Последний в VB6 юзается как-то так (не пробовал, просто загуглил):
https://www.vbforums.com/showthread.php?832087-API-based-random-number-generator-for-VB6&s=80f64227c4ec946fa63ff5cf3f2b6d08&p=5068317&viewfull=1#post5068317

Недавно передо мной встала задача получить на vb6 большое количество истинно случайных чисел (не надо спрашивать)

Я всё же спрошу. Как могли встретиться в одном предложении слова «недавно» и «vb6» в 2020 году?

Все такие истории начинаются похоже. Приходит к тебе кто то, и делая хитрое лицо, спрашивает — помнишь ту программу на складе, которую нам кто то написал в незапамятные времена? Вот мы тут исходники нашли, кровь из носу надо добавить одну штуку. И ты такой смотришь, и такой — блин, чувак, vb6. На дворе 20 год, ты в своем уме? А он тебе тебе такой — ну слушай, ну край как надо, посмотри, а.
И ты такой скачиваешь на каком то забытом сайте дистрибутив, надо же ставится еще. Открываешь, и блин, надо же, открывается. Открываешь код, а руки сами помнят что писать)

В общем, интересный опыт.
Три года назад подходит ко мне библиотекарша из детской библиотеки:
— А помнишь, ты нам программу написал для учёта газетных подшивок?!

Ёкарный бабай! 1995-й год, QBasic, IBM PC XT 286, хард 40 МБ, моник 14", на котором уже почти ничего не видно.

Пришлось подарить им новый комп, переписать программу, сконвертировать БД, которая на тот момент занимала почти 30 МБ. Хард после удаления bad-блоков сократился до 34 вроде.
А не проще в рамках QBasic перемешивать упорядоченный массив чтоб получит случайный набор?
Чем то наподобие такого
Моя шибко плохо помнить КуВасец, старый очень, ногами сильно не пинать, писал вместо обеда ;)
CONST maxsizearray = 16383
DIM arrayrand(0 TO maxsizearray) AS SINGLE
CLS
'fill array
arrayrand(0) = 0
sp# = 1 / maxsizearray

FOR i = 1 TO maxsizearray
arrayrand(i) = 1 — (i * sp#)
NEXT i
RANDOMIZE TIMER
PRINT
'add Rnd pepper
FOR i = 0 TO maxsizearray
nr = RND — RND
arrayrand(i) = ABS(arrayrand(i) + nr)
IF arrayrand(i) > 1 THEN arrayrand(i) = arrayrand(i) — nr
NEXT i
PRINT
'first shuffling
FOR i = 0 TO maxsizearray
f = FIX(maxsizearray * RND)
s = FIX(maxsizearray * RND)
SWAP arrayrand(f), arrayrand(s)
NEXT i
'we shuffle the required number of times (seconds)
'use the first element of the array as the shuffle index for the first time
f = FIX(maxsizearray * arrayrand(0))
s = FIX(maxsizearray * RND)
n = VAL(MID$(TIME$, 7))
FOR t = 0 TO n
FOR i = 0 TO maxsizearray
SWAP arrayrand(f), arrayrand(s)
f = FIX(maxsizearray * RND)
s = FIX(maxsizearray * RND)
NEXT i
NEXT t
Зарегистрируйтесь на Хабре, чтобы оставить комментарий