08 FreeBASIC - случайные числа, RND

24 дня назад

В первом уроке, где речь шла о математических функциях, я одну из функций пропустил, отведя ей особое место.

Функция эта - RND - генератор случайных чисел, только правильно называть его генератор псевдослучайных чисел.
Почему так важно это уточнение? И что вообще значит случайные числа?

Во многих настольных играх есть кости. Если взять кубик и подбросить его несколько раз, записав серию значений в ряд - это и будут случайные числа. Но как такой кубик будет подбрасывать компьютер? Всё решено математикой - придумано множество способов получения таких чисел. Были хорошие, качественные реализации алгоритмоа, "прославились" и плохие. От их качества зависит очень многое, особенно сейчас, во время криптографии(криптовалют). Неудачная реализация приведёт к тому, что "случайные" числа быстро "закончатся" и пойдёт повтор, или анализ последовательности этих чисел позволит "предсказать" следующее.

В компьютере числа генерируются по формуле - берётся некоторое число, затем вычисляется следующее "случайное" число, следующее и следующее - так можно получить столько чисел, столько нужно. Но... после некоторого количества числа станут повторятся. При хорошем алгоритме до зацикливания последовательности может быть очень далеко, даже очень и очень.

В компьютере "случайные числа не случайны" их называют псевдослучайными, но они имеют свойства случайных чисел, например равномерное распределение, должны иметь)). Это значит что если бросить кубик 60000 раз, то каждая цифра(грань) должна выпасть около 10000 раз.

Во FreeBASIC функция генерирующая псевдослучайные числа называется RND. Она генерирует число из интервала [0...1) - случайное число может быть нулём, но всегда меньше единицы.

Выводим на экран четыре случайных числа - использование похоже на переменную rnd

можно и посерьезней - вызвать как функцию без аргументов возвращающую случайное число rnd(), что выглядит более логично. Функция может возвращать каждый раз иное значение, а первый вариант похож на использование переменной - здесь интуитивно можно подумать что print выведет четырежды одно значение перемеенной. Просто в бейсике, в отличие например от С, при вызове функции без аргументов скобки можно и не писать. Я советую пользоваться вариантом со скобками, что выглядит более заумно естественно.

Как видите при повторном запуске программы она генерирует те же самые случайные числа))) Так происходит потому, что формула генерирующая числовую случайную последовательность берёт для её вычисления всё время один и тот же начальный параметр. Это может быть даже удобно, когда нужно проверить, отладить программу.

Ну а для того чтобы сделать случайные числа ещё более случайными))).. чтобы при новом запуске программы генерировалась каждый раз новая псевдослучайная последовательность есть функция randomize

В старых диалектах бейсика у неё был один параметр, который влияет на генерацию первого случайного числа - обычно её использовали так randomize timer

Во FreeBASIC можно использовать без параметров -randomize будет подразумеваться randomize timer. А ещё у этой команды появился второй параметр. Он определяет алгоритм по которому будет строится псевдослучайная последовательность.

Здесь используется timer - функция возвращает время в секундах. Для функции randomize как раз и есть элемент случайности. А обычно эту функцию используют для оценки временных интервалов
a=timer
часть програмы
t=timer-a
теперь в t будет содержаться время в секундах за которое исполнился эта часть програмы

Как же получить любое случайное число, а не только от ноля до единицы?

Например нужно получить случайное число от 1 до 100 [1..100]
Нужно случайное число поулченное от rnd умножить на длину отрезка увеличеную на 1
rnd*(100-1+1) даст нам случайное число от 0 до 99.99999.... Прибавить полученное число к числу начала отрезка.rnd(100-1+1) + 1даст нам случайное число от 1 до 100.99999....int(rnd(100-1+1) + 1)` отбрасываем дробную часть и получаем число от 1 до 100.

Другой пример - получить случайное число от 1 до 6, как на костях.
rnd*(6-1+1) даст от 0 до 5.9999....
rnd*(6-1+1)+1 даст от 1 до 6.9999....
int(rnd*(6-1+1)+1) даст от 1 до 6

Задания

  1. Получить 100 случайных чисел из диапазона [-50..50]
  2. Получить 100 случайных чисел из диапазона [0..750]
  3. Получить 100 случайных чётных целых чисел из диапазона [0..900]
  4. Получить 100 случайных чисел из диапазона [0.01..9.99]

07 FreeBASIC - циклы
06 FreeBASIC условный оператор
05 FreeBASIC - первые простые задачки
04 FreeBasic - графика
03 FreeBASIC. Текстовые переменные и операции с ними
02 FreeBASIC Переменные в Бейсике
01 Начинаем изучать FreeBasic
00 FreeBASIC лучший из диалектов бейсика

@sergiy

Авторы получают вознаграждение, когда пользователи голосуют за их посты.
Голосующие читатели также получают вознаграждение за свой голос.
Порядок сортировки:  Популярное

int(rnd(6-1+1)+1)* НЕ даст от 0 до 5.9999....

Что там собственно выше и говорится: "получить случайное число от 1 до 6, как на костях."

·
73
  ·  24 дня назад

хех)) полночь!! а кто-то не то что читает, а ещё и разбирается
спешил, абзац ещё и не дописал, а там в последней строчке CTRLV не изменил, скопировано с первой - нужно "даст от 1 до 6"

55
  ·  24 дня назад

✅🤙 🚀

7
  ·  24 дня назад

Бесподобно пишите статьи. Узнал много интересного и позновательного. Я подписался на тебя и проголосал, буду рад взаимной подписке. Я тоже пишу полезные статьи)

32
  ·  24 дня назад

Сюда приплывал Моби Дик

70
  ·  23 дня назад

Ваш пост поддержали следующие Инвесторы Сообщества "Добрый кит":
cats, spinner, aim, ianboil, analise, francisgrey, strecoza, mishka, sergiy, vako, rbrown, gildar, ovchinnikov, polyideic, andrvik, max-max, kanenakat, oleg257, zoss, dikaniovs, harhor, dimarss, la-bella-vita, tristamoff, kilobucks, ohlamoon, shuler, rusalka, dany2323, maksina, yurgent71, zlody, dr-boo, arsar, volv, vasilisapor2, nefer, oksi969, turkish-r, renat242, oceanotechnic, markvial, andreyprosto, vict0r, gromozeka, lira, drim, gryph0n, voltash, ladynazgool, ladykosha, karusel1, orezaku, sharps, cepera, francesco, exan, retoldname, stranniksenya, alikssandra, gapel, galerina, acidgarry, kvg, igor66, oagalakova, borisss, candy777, sterh, olga-fink, virt, optimist, dayver, bammbuss, dmitrijv, bombo, manavendra, mr-nikola, ondantr, nerengot, lokkie, dim447, vladsm, mirgais, now, varja, upper, prifix, mp42b, abloud, foxycat, ksantoprotein, alexmove, process, chugoi, massatela, nikulinsb, firestarter, vlad1m1r, shafarevich, d0z4t0r, tulencha, kito-boy, vsebudethorosho, nikitosuna, sansey, izbushka, astramar, goldenriver, onur1s, ramin, cryptovisitor, zelivsky, html, metadon, vredinka2345, fxmonster, carpe-diem, makcl, ivanzar, marina-spring, azarovskiy, funt33, brainmechanic, sinilga, samael27, kalter, valen-tina, maksh, mister-omortson, nightinga1e, siddxa, cryptobandera, doublingseason, necrogenesis, maryatekun, lologom, anykeycheg, delectat, prezza, sini4ka, akva22, worthless-man, pkrugloff, esperos, elcpa, karabum, sevaev, dobrotanya, boliwar, veta-less, irkinmick, wmforum, jpigeon84, kinoshka, archual, alexxela, paulsoul, valdemar777, fatima
Поэтому я тоже проголосовал за него!


dobryj.kit теперь стал Делегатом! Ваш голос важен для всего сообщества!!!
Поддержите нас:

80
  ·  23 дня назад

@sergiy, Поздравляю!
Ваш пост был упомянут в моем хит-параде в следующей категории:

  • Голосов - 7 позицию - 851 Голосов