как я могу сгенерировать случайное число от 1e-9 до 1e9 с одинаковой вероятностью в r?

#r #random

Вопрос:

Я пытаюсь сгенерировать случайное число от 1e-9 до 1e9. Очень наивная идея состоит в том, чтобы сгенерировать последовательность от 1 до 1e18, а затем разделить на 1e9. как показано ниже. но, похоже, это не работает.

 set.seed(100)
rand <- sort(runif(10000, min =1, max= 1e18))/1e9
result <- sample(rand, 1)
min(rand) 
max(rand)

# result 664426274
# min(rand) 199051.1
# max(rand) 999853646

rand %>% ecdf() %>%  plot
log(rand) %>% ecdf() %>%  plot

 

минимальное число намного больше, чем я ожидаю. Друзья, я проверил сюжет с ecdf помощью . похоже, что числа ниже 1 довольно ограничены.
Как я могу сгенерировать однородную распределенную последовательность?

введите описание изображения здесь

ps, что, если я сгенерирую последовательность из 2 шагов?

 rand2 <- c(runif(5000)/1e9, runif(5000, min = 1, max = 1e9))
 

это происходит таким образом.

введите описание изображения здесь

rand2 %>% ecdf() %>>% журнал построения(rand2) %>>>% ecdf() %>>>>% график

Пожалуйста, посоветуйте.

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

1. Чего вы ожидали от минимального номера? не похоже, что вы ожидаете равномерного распределения. Вы ожидали бы, что почти не получите чисел меньше 1, если вы находитесь в диапазоне от ~0 до 1 000 000 000 при 10 000 розыгрышах

2. Вы имели в виду «от 1e-9 до 1e9» или «от-1e9 до 1e9» ?

3. Если вы сгенерируете случайное число от 0 до 1e9, оно почти всегда будет выше 1 (только одно из миллиарда чисел будет ниже 1). Вам нужно равномерное распределение по логарифмам, где порядок величины распределен равномерно (например, вероятность того, что он будет в (.1, 1), как в (1, 10), так и в (10, 100)?)

4. спасибо, я ожидаю от 1e-9 до 1e9. 10000 образцов приведены только для справки.

5. Вам нужно объяснить, как вы ожидаете, что нелинейная последовательность будет линейной. (Что, как я уже писал, является сутью ответа @FlightOdyssey.)

Ответ №1:

Ваш код выглядит правильно. Подумайте об этом: если вы генерируете случайное число равномерно между 1e-9 и 1e9, каковы шансы, что оно будет меньше, чем, скажем, 1? Ну, так и было бы 1/(1e9 - 1e-9) , или примерно один на миллиард. Поэтому вполне ожидаемо, что если вы создадите только 10000 примеров, вы никогда не увидите результат, близкий к границе.

С другой стороны, возможно, на самом деле вы ищете, чтобы показатель степени был равномерно распределен между -9 и 9? (Трудно сказать, правда это или нет, это зависит от вашего варианта использования.) В этом случае вы захотите выбрать равномерный x между -9 и 9, а затем вычислить 10^x.

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

1. спасибо, я попробовал этот подход, и я попробую еще раз.