Естественные науки

как работает функция случайных чисел во всех языках программирования? (как ее вызывать писать не надо)

Поучить действительно произвольные числа - весьма непросто. Для этого требуется специальное устройство и программа; это поэтому такой команды в ассемблерах навядли встретишь - это целая подпрограмма вызывается. А ус-во -генератор энтропии - в простых машинах, его роль может выполнять и таймер, и шум снятый с выхода аудиокарты - но по причине простоты таких устройств, несовершенстве алгоритма генерации, полученнные числа называют псевдослучайными - не исключена возможность повторяемости, коллизий и т. п. http://habrahabr.ru/post/132217/
Ольга Балбекова
Ольга Балбекова
18 136
Лучший ответ
обычно в стандартных библиотеках используется линейный конгруентный датчик.

типа:
operator unsigned long () {
return lastVal = 3141592621UL*lastVal + 907633385ul;
}
lastVal сначала инициализируется отдельной функцией. Константы могут быть разные, но на них наложена куча ограничений (можно почитать в Кнуте), так что лучше использовать готовые.

Датчик плохонький, особенно, если брать его младшие знаки, зато быстрый.
в ассемблере ее нет, других языков не знаю.
Татьяна Мартынова как вы выучили ассемблер?
Там вырабатываются не случайные, а псевдослучайные числа. Например, можно возводить предыдущее число в квадрат и брать из результат средние цифры. Но обычно используется линейный когруэнтный метод, дающий более равномерное распределение чисел: предыдущее число умножается на какой-то множитель и добавляется константа, после чего результат обрубается сверху до заданного числа разрядов. Множитель и константа выбираются исходя из определенных математических соотношений, теория изложена у Кнута в третьем томе.
в языке Ассемблер таковой нет-её пишут отдельно, в других это функция RND -в разных языках она работает по разному
в Бейсике MSX к примеру, данная функция за определенный промежуток времени опрашивает системный таймер, копирует число от 0 до 1 и все, ты просто его умножаешь на сто, делишь на что то другое чтобы получить нужный диапазон
в Паскале почти тоже самое с Фортраном
Oxana Tsyganok
Oxana Tsyganok
93 393
В низкоуровневых языках ГСЧ работают обычно на шумах. Ну, или пресловутый конгруэнтный метод (хотя, как показывает практика моделирования методом Монте-Карло, конгруэнтный генератор выдает псевдослучайные числа с приличной корреляцией, и поэтому лично я ЛКМ не доверяю).

Высокоуровневые языки обычно своего ГСЧ не имеют, а юзают соответствующие функции ОСи, например, АПИ.
Ради прикола:
ru.cppreference.com/w/cpp/numeric/random

"Случайное число двигателей" - это random number engines, если в ссылке ru на en заменить. Вот так, по-виимому, и работают: -)
В самых общих чертах есть две задачи: инициализация ГСЧ (долгая) и генерация псевдослучайной последовательности (пошустрее). Обе можно рассматривать подробно. Если есть хорошая хэш-функция и пачка любого псевдослучайного мусора с хорошей энтропией для инициализации, то обе неплохо решаются.
Odil Sadikov
Odil Sadikov
19 662
Используется либо таймер либо тактовый счетчик
Татьяна Мартынова получается числа не случайные?

Похожие вопросы