нужно написать новый генератор случайных чисел в R - PullRequest
0 голосов
/ 16 сентября 2018

Мне нужно сгенерировать 7 случайных чисел между -1,1, сумма которых равна 1. Я использовал этот код для этого.

 diff(c(0, sort(round(runif(7,-1,1),2)), 1))

Но у меня есть большая проблема с этим.

один вывод этого кода: -0,89, 0,21, 0,00, 0,21, 0,30, 0,19, 0,61, -0,63 .

Проблема в том, что он однороден, так что каждый раз он генерирует большие случайные числа в первом и последнем числе, а это не то, что мне нужно Мне нужно, чтобы это было распространено на все номера. ех. 0,22 -.21 .33 -.12 0,11 0,35 -0,08 (сумма не равна 1 только для примера)

Вы знаете, кому я могу написать код для получения такого рода случайных чисел?

Ответы [ 3 ]

0 голосов
/ 16 сентября 2018

Подобное решение, как у Салмана Лашкарара.Вы должны округлить числа, чтобы найти решение.

library(magrittr)

set.seed(42)
x <- 1

while(sum(x) != 0){
  x <- runif(7,-1,1) %>%
    round(3)
}

x
#> [1]  0.155  0.559 -0.335 -0.230 -0.490 -0.557  0.898
sum(x)
#> [1] 0

Created on 2018-09-16 by the [reprex package](http://reprex.tidyverse.org) (v0.2.0).
0 голосов
/ 16 сентября 2018

Ваша общая идея, вероятно, вдохновлена ​​ответами, связанными в описании . Стандартная проблема состоит в том, как сгенерировать 7 чисел от 0 до 1, которые добавляют к 1. Ответ:

diff(c(0, sort(runif(6, 0, 1)), 1))
#> [1] 0.27960792 0.02035231 0.02638626 0.09945877 0.25134002 0.03379598 0.28905874

Необходимые модификации для получения чисел от -1 до 1 довольно просты; просто пропустите sort:

diff(c(0, runif(6, 0, 1), 1))
#> [1]  0.9961661 -0.6528227  0.5298829 -0.2087127 -0.2298045  0.2017705  0.3635203

Как это работает? Мы снова делим пространство между нулем и единицей. Но, исключая сортировку, мы допускаем возможность возврата назад, то есть возможны отрицательные числа. Вот гистограмма для 1000 поколений:

enter image description here

Одна слабость в этом подходе состоит в том, что первое и последнее числа обязательно положительны. Если это вас беспокоит, вы можете добавить еще sample, например ::

sample(diff(c(0, runif(6, 0, 1), 1)), 7)
#> [1] -0.004242793 -0.725348335  0.385971491  0.320525822  0.389915347
#> [6]  0.053195271  0.579983197
0 голосов
/ 16 сентября 2018

Может быть 2 решения, и оба они работают с бесконечным циклом:

Решение 1:

Можно рассмотреть 6 случайных чисел и 1 зависимое, поэтомусумма их может быть 1. Но, может случиться так, что элемент станет больше 1 или меньше -1.Поэтому мы не можем принять все ответы.

while(T){
  res<-runif(6,-1,1)

  res<-append(res,1-sum(res))

  if(sum(res>1)==0)
    break
}

res

Вывод:

-0.34038038  0.15811401 -0.20748670  0.26443104  0.45216639 -0.09912685  0.77228248

Решение 2:

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

while(T){
  res<-round(runif(7,-1,1), digits = 1)
  print(sum(res))
  if(sum(res)==1)

     break

  }

res

Вывод:

> res
[1] -0.6  0.2  0.4  0.7 -0.2  0.6 -0.1
...