在R中生成随机数

p1iqtdky  于 2023-04-09  发布在  其他
关注(0)|答案(4)|浏览(305)

在R中,如何生成150个随机数,至少使用一次从1到100的数字?

library(tidyverse)
set.seed(123)
df <- tibble(Random_number = sample(x = 1:100,
                                    size = 150,
                                    replace = TRUE)) %>% 
  arrange(Random_number)

例如,数字1,2,3等从来没有出现过,我知道这个脚本不够好,不能像我期望的那样,让数字1到100总是至少出现一次,但我完全不知道实际上如何编写脚本。

zour9fqk

zour9fqk1#

您可以将程序分为两个部分:一个是确保1:100,另一个是从1:100中抽取额外的50样本,例如,

sample(c(1:100, sample(1:100, 50, replace = TRUE)))
5w9g7ksd

5w9g7ksd2#

我们可以将数字sample三次以达到您的目的。第一次sample从1到100的50个数字,替换为。第二次将1到100的序列随机化。第三次将对上述两个输出进行sample,以随机化150个数字。
请注意,上面提到的后两个sample使用默认的sample,而没有替换。

library(dplyr)

set.seed(123)

df <- tibble(Random_number = sample(c(sample(1:100, 50, replace = T), sample(1:100))))

table结果显示从1到100的数字至少被采样一次。

table(df$Random_number)

  1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17 
  1   2   1   1   1   1   1   2   1   1   2   2   3   1   1   2   1 
 18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34 
  1   2   3   2   2   1   1   1   2   1   1   1   3   2   1   3   1 
 35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51 
  2   2   1   1   2   2   2   3   1   1   1   1   2   1   1   3   1 
 52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68 
  1   1   1   1   1   1   1   1   1   1   1   2   1   1   1   2   1 
 69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85 
  2   1   1   1   1   3   1   2   2   1   1   1   4   3   2   2   1 
 86  87  88  89  90  91  92  93  94  95  96  97  98  99 100 
  1   1   1   2   1   1   1   2   4   1   3   1   2   1   1
llycmphe

llycmphe3#

下面是一个函数,它对从1到n的所有数字至少采样一次。
1.如果n大于或等于size,则仅为数字n。这是因为sample(n)将打乱序列1:n;
1.如果size大于n,则序列1:n加上1:n中的size - n数字

fun <- function(n, size, replace = TRUE) {
  x <- if(n >= size) n else c(seq.int(n), sample(n, size - n, replace = replace))
  sample(x)
}

set.seed(2023)
table(fun(100, 150))
#> 
#>   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20 
#>   1   1   2   2   2   1   1   1   2   1   1   1   1   1   1   1   2   1   2   1 
#>  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40 
#>   1   1   1   2   1   2   1   1   2   2   1   2   2   2   1   2   2   2   2   2 
#>  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60 
#>   2   2   1   2   2   2   2   2   2   1   1   2   1   1   1   2   2   1   1   2 
#>  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80 
#>   1   1   2   2   2   1   1   2   1   2   1   2   1   1   2   2   1   2   2   2 
#>  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100 
#>   2   1   2   1   1   2   1   1   1   2   2   1   2   1   2   2   1   2   1   1

创建于2023-04-08使用reprex v2.0.2

nbnkbykc

nbnkbykc4#

好吧,我错了(见对Rui的回答的评论)。尽可能避免sample会让事情运行得更快。

Rgames> n = 1e4
Rgames> size = 1.5e4
Rgames> microbenchmark(rifelse(n,size), rtrisamp(n,size), rbisamp(n,size))
Unit: microseconds
              expr      min        lq      mean    median        uq       max neval cld
  rifelse(n, size)  849.655  968.8905  982.1622  975.5885  996.2145  1089.916   100 a  
 rtrisamp(n, size) 2261.861 2365.4385 2587.5585 2374.7670 2390.5145 13360.855   100   c
  rbisamp(n, size) 1400.847 1576.1280 1684.7027 1584.5185 1592.8440 11510.640   100  b

相关问题