用R生成随机数


1. 随机数生成

  作为一种统计分析语言,R是一个生成各种统计分布功能随机数的综合性图书馆。在这篇文章中,我想专注于这个简单的问题:我如何生成一个随机数?

  答案取决于你想要什么样的随机数生成?让我们通过例子说明。

  a) 生成 5.0 和 7.5 之间的随机数

  如果你想生成一个十进制数规定的最低和最高之间的任何值(包括分数值)同样是可能的,使用runif()功能。 这个函数生成均匀分布的值。 这里是如何生成一个 5.0 和 7.5 之间的随机数的方法:

    > x1 <- runif(1, 5.0, 7.5) 
    > x1 
    [1] 5.573882

  当然,当你运行这个,你会得到一个不同的数字,但它一定会在 5.0 和 7.5 之间。 你不会得到准确值 5.0 或 7.5 。

  如果你想生成多个随机的值,不要使用一个循环。您可以生成多个值一次通过指定您要作为第一个参数runif()值的数目。这里是如何产生10个 5.0 和 7.5 之间的值:

    > x2 <- runif(10, 5.0, 7.5) 
    > x2 
     [1] 6.871893 6.518833 5.372662 6.808643 5.490282 7.381824
     [7] 7.476985 5.569176 6.182591 5.285149

  b) 生成 1 到 10 之间的随机整数

  这看起来像最后一个相同的运动,但现在我们只希望完整的数字,而不是分数值。 为此,我们使用的示例函数:

    > x3 <- sample(1:10, 1)
    > x3
    [1] 3

  c) 各种分布的随机数生存函数

    rnorm(n, mean=0, sd=1)   # 正态分布
    rexp(n, rate=1)   # 指数
    rgamma(n, shape, rate=1, scale=1/rate)   # r 分布
    rpois(n, lambda)   # 泊松
    rt(n, df, ncp)   # t 分布
    rf(n, df1, df2, ncp)   # f 分布
    rchisq(n, df, ncp=0)   # 卡方分布
    rbinom(n, size, prob)   # 二项分布
    rweibull(n, shape, scale=1)   # weibull 分布
    rbata(n, shape1, shape2)   # bata 分布

2. 抽样模拟

  a) 在 1 到 10 之间随机抽取 1 个数

    > x1 <- sample(1:10, 1)
    > x1
    [1] 3

  第一个参数是一个有效的数字向量生成(这里的数字1到10),第二个参数表示应返回一个数字。

  b) 在 “一组数” 之间随机抽取 多 个数

  如果我们要生成多个随机数,我们必须增加一个额外的参数,表示允许重复:

    # 有放回抽取
    > x2 <- sample(1:10, 5, replace=T)
    > x2
    [1] 1 5 9 9 8

  如果我们要生成多个随机数,我们必须增加一个额外的参数,表示不允许重复:

    # 无放回抽取
    > x3 <- sample(1:40, 6, replace=F)
    > x3
    [1]  3 40 20 19 28 11

  c) 对一组数据进行乱序排序(随机抽取,顺序随机)

  你可以使用同样的想法产生的任何载体的随机子集,甚至不包含数字。 例如,选择10个不同的美国各州随机:

    > sample(state.name, 10)
     [1] "Delaware"     "Vermont"      "Rhode Island" "Tennessee"   
     [5] "Arizona"      "Mississippi"  "Virginia"     "Alaska"      
     [9] "Georgia"      "Louisiana"  

    > sample(state.name, 52)
    Error in sample.int(length(x), size, replace, prob) : 
      cannot take a sample larger than the population when 'replace = FALSE'

    > length(state.name)
    [1] 50
    
    > sample(state.name, 50)
     [1] "Oregon"         "Georgia"        "Maine"         
     [4] "Idaho"          "Alaska"         "Tennessee"     
     [7] "Indiana"        "Wyoming"        "Montana"       
    [10] "Utah"           "Florida"        "North Carolina"
    [13] "Nevada"         "Virginia"       "Pennsylvania"  
    [16] "North Dakota"   "Wisconsin"      "Alabama"       
    [19] "Mississippi"    "New Hampshire"  "Delaware"      
    [22] "Arizona"        "Massachusetts"  "Vermont"       
    [25] "Maryland"       "Missouri"       "Michigan"      
    [28] "Connecticut"    "Colorado"       "New York"      
    [31] "Oklahoma"       "California"     "Washington"    
    [34] "South Carolina" "West Virginia"  "Hawaii"        
    [37] "Illinois"       "Arkansas"       "Kentucky"      
    [40] "Iowa"           "Kansas"         "Rhode Island"  
    [43] "New Mexico"     "South Dakota"   "New Jersey"    
    [46] "Nebraska"       "Ohio"           "Texas"         
    [49] "Louisiana"      "Minnesota"     
    
    > sample(state.name, 50)
     [1] "Arkansas"       "California"     "Texas"         
     [4] "Tennessee"      "Montana"        "Massachusetts" 
     [7] "North Dakota"   "Oregon"         "Delaware"      
    [10] "Hawaii"         "South Dakota"   "Connecticut"   
    [13] "South Carolina" "Kansas"         "Washington"    
    [16] "West Virginia"  "Georgia"        "Maine"         
    [19] "Wyoming"        "Illinois"       "Nebraska"      
    [22] "Idaho"          "Maryland"       "Ohio"          
    [25] "Indiana"        "Louisiana"      "Mississippi"   
    [28] "Iowa"           "New York"       "Minnesota"     
    [31] "Rhode Island"   "New Mexico"     "New Jersey"    
    [34] "Pennsylvania"   "Kentucky"       "Utah"          
    [37] "Nevada"         "Arizona"        "Missouri"      
    [40] "North Carolina" "New Hampshire"  "Wisconsin"     
    [43] "Alaska"         "Vermont"        "Alabama"       
    [46] "Florida"        "Oklahoma"       "Michigan"      
    [49] "Colorado"       "Virginia"      
    > 

  d) 随机从矩阵(数据框)中选取一部分对象

    -----------------------------------------------------   
    (col.name=colnames(mtcars))
    (row.name=rownames(mtcars))
    #列名向量不返回抽样
    (sam.col.name=sample(col.name,10,replace=FALSE))
    #行名向量不返回抽样
    (sam.row.name=sample(row.name,10,replace=FALSE))
    B=mtcars[sam.row.name,sam.col.name]
    B
    -----------------------------------------------------
    > (col.name=colnames(mtcars))
     [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"  
    [10] "gear" "carb"
    > (row.name=rownames(mtcars))
     [1] "Mazda RX4"           "Mazda RX4 Wag"      
     [3] "Datsun 710"          "Hornet 4 Drive"     
     [5] "Hornet Sportabout"   "Valiant"            
     [7] "Duster 360"          "Merc 240D"          
     [9] "Merc 230"            "Merc 280"           
    [11] "Merc 280C"           "Merc 450SE"         
    [13] "Merc 450SL"          "Merc 450SLC"        
    [15] "Cadillac Fleetwood"  "Lincoln Continental"
    [17] "Chrysler Imperial"   "Fiat 128"           
    [19] "Honda Civic"         "Toyota Corolla"     
    [21] "Toyota Corona"       "Dodge Challenger"   
    [23] "AMC Javelin"         "Camaro Z28"         
    [25] "Pontiac Firebird"    "Fiat X1-9"          
    [27] "Porsche 914-2"       "Lotus Europa"       
    [29] "Ford Pantera L"      "Ferrari Dino"       
    [31] "Maserati Bora"       "Volvo 142E"         
    > #列名向量不返回抽样
    > (sam.col.name=sample(col.name,10,replace=FALSE))
     [1] "mpg"  "qsec" "wt"   "disp" "carb" "cyl"  "vs"   "am"   "hp"  
    [10] "gear"
    > #行名向量不返回抽样
    > (sam.row.name=sample(row.name,10,replace=FALSE))
     [1] "Merc 230"          "Pontiac Firebird"  "Maserati Bora"    
     [4] "Hornet Sportabout" "Merc 450SE"        "Merc 280"         
     [7] "Duster 360"        "Merc 280C"         "Dodge Challenger" 
    [10] "Camaro Z28"       
    > B=mtcars[sam.row.name,sam.col.name]
    > B
                       mpg  qsec    wt  disp carb cyl vs am  hp gear
    Merc 230          22.8 22.90 3.150 140.8    2   4  1  0  95    4
    Pontiac Firebird  19.2 17.05 3.845 400.0    2   8  0  0 175    3
    Maserati Bora     15.0 14.60 3.570 301.0    8   8  0  1 335    5
    Hornet Sportabout 18.7 17.02 3.440 360.0    2   8  0  0 175    3
    Merc 450SE        16.4 17.40 4.070 275.8    3   8  0  0 180    3
    Merc 280          19.2 18.30 3.440 167.6    4   6  1  0 123    4
    Duster 360        14.3 15.84 3.570 360.0    4   8  0  0 245    3
    Merc 280C         17.8 18.90 3.440 167.6    4   6  1  0 123    4
    Dodge Challenger  15.5 16.87 3.520 318.0    2   8  0  0 150    3
    Camaro Z28        13.3 15.41 3.840 350.0    4   8  0  0 245    3
    > 
    -----------------------------------------------------

  e) 有放回的随机抽样示例

  在e里随机有放回地取N数,形成一个向量

    e <- c(1:6)
    N <- 100
    s <- sample(x=e, size=N, replace=TRUE)
    table(s)

    > e <- c(1:6)
    > N <- 100
    > s <- sample(x=e, size=N, replace=TRUE)
    > table(s)
    s
     1  2  3  4  5  6 
    16 19 14 21 19 11 

  f) 用sample函数实现随机排序(抽样)

  sample函数第一个参数x表示被抽样的向量,第二个参数size表示抽取的样本个数,第三个参数replace表示是不是有放回的抽样。

    -----------------------------------------------------
    Vec <- 1:10
    # 无放回抽样
    sample(x = Vec, size = 5)
    sample(x = Vec, size = 5)
    # 只要第二个参数size的数值和第一个参数x的长度相同就可以实现随机排序。
    sample(x = Vec, size = 10)
    sample(x = Vec, size = 10)
    # 有放回抽样
    sample(x = Vec, size = 10, replace = TRUE)
    sample(x = Vec, size = 10, replace = TRUE)
    -----------------------------------------------------
    > Vec <- 1:10
    > # 无放回抽样
    > sample(x = Vec, size = 5)
    [1] 9 3 1 5 4
    > sample(x = Vec, size = 5)
    [1]  3  1  4  9 10
    > # 只要第二个参数size的数值和第一个参数x的长度相同就可以实现随机排序。
    > sample(x = Vec, size = 10)
     [1]  1  6  2 10  7  8  3  9  5  4
    > sample(x = Vec, size = 10)
     [1]  6  9 10  7  1  5  8  3  4  2
    > # 有放回抽样
    > sample(x = Vec, size = 10, replace = TRUE)
     [1]  3  6  2  2  8  8  3  6 10  8
    > sample(x = Vec, size = 10, replace = TRUE)
     [1]  7  5 10  5  7  3  1  6  4  7
    -----------------------------------------------------
 
 

3. 设置随机数种子

    > set.seed(1234)
    > x <- rnorm(10)
    > x
     [1] -1.2070657  0.2774292  1.0844412 -2.3456977  0.4291247
     [6]  0.5060559 -0.5747400 -0.5466319 -0.5644520 -0.8900378
    > 
    > # 设置了随机数种子后,每次产生的分布数都是相同的
    > set.seed(1234)
    > x <- rnorm(10)
    > x
     [1] -1.2070657  0.2774292  1.0844412 -2.3456977  0.4291247
     [6]  0.5060559 -0.5747400 -0.5466319 -0.5644520 -0.8900378
    > 
    > # 移除了随机数种子后,产生的随机分布改变了
    > rm(.Random.seed)
    > 
    > x <- rnorm(10)
    > x
     [1]  0.6977298  0.6580453  0.5422976  0.1453601 -0.4882267
     [6]  0.6037503 -0.8052218  0.3463612 -2.3368599  0.6643264
    >
  • 40
    点赞
  • 169
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值