Случайные числа в Racket

Я пытаюсь сгенерировать случайные числа от 0 до 1, включая границы 0 и 1 в Racket. До сих пор не нашел решения. Есть хороший способ?

Этот вопрос неясен. Что вы имеете в виду под «включая границы»? Если вы моделируете однородную случайную величину на [0,1], тогда вероятность получения 0 или 1 исчезающе мала. Просто используйте стандартную библиотеку RNG.

John Coleman 23.08.2018 15:49

Считайте, что обычно случайные числа являются значениями с плавающей запятой и генерируются между нулем и единицей (0<n<1), но он любит включать пределы, чтобы в качестве возвращаемого значения также могло быть ноль и единица (0<=n<=1).

U880D 23.08.2018 15:59

С какой вероятностью должны появиться 0 и 1? Если ответ будет чем-то другим, кроме 0, вы больше не говорите о равномерном случайном числе на [0,1], поэтому вопрос неясен, поскольку желаемое распределение не было указано. С другой стороны, если ответ - 0, то стандартного random вполне достаточно. Если я неправильно понимаю ваш вопрос, поясните, пожалуйста,

John Coleman 23.08.2018 16:15

Именно так указал @ U880D. Обычная случайная процедура просто возвращает значение x, где 0 <x <1. Я хотел бы использовать функцию, возвращающую значение x, где 0 <= x <= 1 и каждое значение x должно иметь одинаковую вероятность.

Newbie1234567 23.08.2018 17:27

«каждое значение x должно иметь одинаковую вероятность» - это недооценка непрерывного распределения. Если X является непрерывной случайной величиной на [0,1], то для любого конкретного x в [0,1] у нас есть Pr(X = x) = 0. Вы так и не ответили на вопрос: с какой вероятностью вы хотите, чтобы появились 0 и 1?

John Coleman 23.08.2018 17:51
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
1 018
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Используйте (random), чтобы сгенерировать число от 0,0 до 1,0.

Чтобы включить 0.0 и 1.0, вы можете использовать:

(define (r)
  (/ (random 4294967087)
     4294967086.0))

random возвращает реальное значение от 0 до 1, без 0 и 1. Мой вопрос был: как создать функцию, возвращающую случайное действительное число x, где 0 <= x <= 1. Извините за неточность.

Newbie1234567 23.08.2018 17:31
Ответ принят как подходящий

Как упоминает Согаард в своем ответе, вы должны просто использовать (random). Это правда, что он производит число в открытом диапазоне (0, 1), а не в закрытом диапазоне [0, 1], который вам нужен. Тем не менее, я собираюсь представить аргумент, подкрепленный некоторыми цифрами, что разница не имеет значения.

Процедура random создает число с плавающей запятой двойной точности IEEE 754. Следующее по величине число, представляемое в этом формате после 0, составляет примерно 4,94 × 10-324. Если мы предположим, что (random) действительно дает число, равномерно распределенное по всему диапазону, то это будет означать, что вероятность когда-либо действительно произвести 0.0 составляет один к 4,94 × 10324! Чтобы дать вам немного контекста для этого числа, это означает, что даже если вы генерируете один миллиард случайных чисел каждую секунду, все равно потребуется в среднем 6,41 × 10306 лет для генерации 0.0 даже один раз.

На другом конце диапазона ситуация на маленький менее мрачная, поскольку разница между 1 и следующим наименьшим числом, представляемым двойными флуоресцентными буквами, значительно больше: примерно 1,11 × 10-16. На этом конце диапазона, если бы мы снова генерировали один миллиард случайных чисел каждую секунду, то в среднем потребовалось бы «всего» 104 дня, прежде чем генерировать 1.0 в первый раз. Тем не менее, это все равно было бы совершенно незначительным по сравнению с огромным объемом данных, которые вы уже сгенерировали (и действительно, маловероятно, что вы собираетесь генерировать миллиард случайных чисел в секунду для начала, так как это займет больше минуты, всего лишь для генерации миллиарда случайных чисел на моей машине).

Не беспокойтесь об этих недостающих концах диапазона, так как они действительно не будут иметь значения. Просто позвоните (random) и покончим с этим.

Этот аргумент кажется не совсем убедительным. В документации предполагается, что базовый ГСЧ имеет 52-битное внутреннее состояние. (random) отображает это состояние на (0,1), но вы можете четко сопоставить это состояние с [0,1] таким образом, чтобы могли возникнуть 0 и 1. Если это так, то вероятность получить 0 и 1 тогда будет не меньше 2^-52, что, конечно, слишком мало, чтобы о нем беспокоиться, но не так редко, как предполагает ваш аргумент. Тем не менее (+1) за то, что показал OP, что они беспокоятся о чем-то, что по сути является ничем.

John Coleman 23.08.2018 20:21

@JohnColeman Я согласен с вами ... Я подумал о том, чтобы попытаться включить в этот ответ информацию о практических ограничениях, вводимых деталями реализации ГПСЧ Racket, но в итоге я этого не сделал. Я думаю, что предоставление действительно точных цифр потребовало бы изучения того, как ГПСЧ работает внутри компании, чего я не хочу делать. Я думал о добавлении одноразовой строчки где-нибудь о верхних / нижних границах из-за размера штата, и, возможно, мне все еще стоит, но я не думаю, что это кардинально меняет вывод из этого ответа.

Alexis King 23.08.2018 20:26

Во многих смыслах сами числа не имеют значения. То, что существует определенное число, которое встречается с ненулевой вероятностью, является неизбежным дефект(random). Я не вижу веских причин для того, чтобы настаивать на том, чтобы 0 и 1 присоединились к списку номеров, где возникает этот дефект.

John Coleman 23.08.2018 20:31

@JohnColeman: Это правда, хотя я думаю, что такое толкование, возможно, не самый полезный фрейм. Я думаю, что более мотивирующим фреймом является то, что недостатком (random) является то, что некоторые числа в диапазоне действительно никогда не будут сгенерированы, а не Больше никогда. Тот факт, что 0 и 1 принадлежат к набору чисел, которые на самом деле никогда не будут сгенерированы, менее значим, если учесть все другие числа в диапазоне [0, 1], которые также принадлежат этому набору.

Alexis King 23.08.2018 20:35

Другие вопросы по теме