Как с равной вероятностью сгенерировать случайные числа различной длины, скажем, от 3 до 7 цифр.

В конце я хотел бы, чтобы код содержал от 3 до 7 цифр (с равной вероятностью), состоящий из случайных чисел от 0 до 9.

Я придумал это решение, но считаю, что оно слишком сложно из-за обязательной генерации фрейма данных.

options(scipen=999)
t <- as.data.frame(c(1000,10000,100000,1000000,10000000))
round(runif(1, 0,1) * sample_n(t,1, replace = TRUE),0)

Есть ли более элегантное решение?

3
Hendrik 23 Окт 2018 в 14:28

2 ответа

Лучший ответ

Вы можете использовать векторизованный подход и выбирать из допустимого диапазона показателей прямо в экспоненте:

pick.nums <- function(n){floor(10^(sample(3:7,n,replace = TRUE))*runif(n))}

Например,

> set.seed(123)
> pick.nums(5)
[1]     455  528105   89241 5514350 4566147
2
John Coleman 23 Окт 2018 в 17:28

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

  • случайным образом выберите число len из [3, 7], определяющее длину вывода
  • случайным образом выбрать len чисел из [0, 9]
  • объединить эти числа

Код для этого:

(len <- runif(1, 3, 7) %/% 1)
(s <- runif(len, 0, 9) %/% 1)
cat(s, sep = "")

Я ранее давал этот ответ; однако это не соответствует требованиям, как стало ясно после того, как OP предоставил дополнительную информацию.

Разве это не сводится к генерации случайного числа от 100 до 9999999? Если да, то делает ли это то, что вы хотите?

runif(5, 100, 9999999) %/% 1

Вы, вероятно, также можете использовать round, но вам всегда придется округлять в меньшую сторону.

Выход:

[1] 4531543 9411580 2195906 3510185 1129009
3
Oliver Baumann 23 Окт 2018 в 12:56
52947946