【问题标题】:pick a random number, always with increasing value over last random number picked选择一个随机数,总是比上次选择的随机数增加值
【发布时间】:2012-09-17 15:36:55
【问题描述】:

我将如何有效地对值 1:n 进行 1×1 升序随机抽样,确保每个随机抽样值始终高于 之前的值?

例如:

对于值 1:100,获取一个随机数,例如 61。(当前列表=61)
然后在 62 到 100 之间选择另一个数字,比如 90(当前列表=61,90)
然后在 91 到 100 之间选择另一个数字,比如 100。
在达到最大值时停止进程(最终列表=61,90,100)

我一直陷入循环,以这种笨拙的方式思考:

a1 <- sample(1:100,1)

if(a1 < 100) {
    a2 <- sample((a+1):100,1)
        }

etc etc...

我想报告一个最终向量是 a1,a2,a(n) 的串联:

result <- c(a1,a2)

尽管这听起来像是一个家庭作业问题,但事实并非如此。谢天谢地,我多年前离开了做作业的日子。

【问题讨论】:

    标签: r random sample


    【解决方案1】:

    聚会迟到了,但我认为这会震撼你的世界:

    unique(cummax(sample.int(100)))
    

    【讨论】:

    • 这真是太棒了! (我以前从未见过cummax,显然我从来没有费心阅读cumsum 的帮助)
    【解决方案2】:

    这使用了while 循环并被包装在一个函数中

    # from ?sample
    resample <- function(x, ...) x[sample.int(length(x), ...)]
    
    sample_z <-  function(n){
      z <- numeric(n)
      new <- 0
      count <- 1
    
      while(new < n){
        from <- seq(new+1,n,by=1)
        new <- resample(from, size= 1)
        z[count] <- new
        if(new < n)  count <- count+1
      }
    
      z[1:count]
    }
    
    set.seed(1234)
    
    sample_z(100)
    ## [1]  12  67  88  96 100
    

    编辑

    注意当新样本为 100 时要处理的更改以及 sample 处理整数而不是 x 的向量的方式

    编辑 2

    实际上阅读sample 的帮助提供了有用的resample 功能。这避免了长度(x)== 1时的陷阱

    【讨论】:

    • 我在这段代码中得到了一些奇怪的结果,它有时会达到 99 并再次从较低的点开始。调查它...
    • 嗯,我明白你的意思了——我会考虑的!
    • 由于x 是单个整数而不是向量时sample 的变化方式 - 已更改(使用 1e6 样本进行测试,没有错误)
    • 现在更好了,因为实际阅读了示例的帮助
    【解决方案3】:

    效率不是特别高,但是:

    X <- 0
    samps <- c()
    while (X < 100) {
        if(is.null(samps)) {z <- 1 } else {z <- 1 + samps[length(samps)]}
        if (z == 100) {
            samps <- c(samps, z)
        } else { 
            samps <- c(samps, sample(z:100, 1))
        }
        X <- samps[length(samps)]
    }
    

    采样 编辑:从中修剪一点脂肪:

    samps <- c()
    while (is.null(samps[length(samps)]) ||  samps[length(samps)] < 100 ) {
        if(is.null(samps)) {z <- 1 } else {z <- 1 + samps[length(samps)]}
        if (z == 100) {
            samps <- c(samps, z)
        } else { 
            samps <- c(samps, sample(z:100, 1))
        }
    }
    
    samps
    

    【讨论】:

    • 这个工作正常,虽然它有时会重复前面的值,而不是至少重复一个。
    • 不应该;在您发布前大约五分钟,我进行了一次编辑,每次添加 1。我对其进行了 100,000 次重复测试,但从未重复前面的值。
    • 抱歉,我错过了你的秘密编辑。现在看起来一切都很好。
    【解决方案4】:

    甚至参加聚会,但只是为了好玩:

    X <- Y <- sample(100L)
    while(length(X <- Y) != length(Y <- X[c(TRUE, diff(X)>0)])) {}
    

    > print(X)
    [1]  28  44  60  98 100
    

    【讨论】:

      【解决方案5】:

      对随机向量进行排序

      创建一个随机整数向量,然后对其进行排序。

      sort(sample(1:1000, size = 10, replace = FALSE),decreasing = FALSE)
      

      给出 10 个 1 到 1000 之间的随机整数。

      > sort(sample(1:1000, size = 10, replace = FALSE),decreasing = FALSE)
      [1]  44  88 164 314 617 814 845 917 944 995
      

      这当然也适用于随机小数和浮点数。

      【讨论】:

        猜你喜欢
        • 2012-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-30
        • 1970-01-01
        • 1970-01-01
        • 2012-02-21
        • 2016-05-09
        相关资源
        最近更新 更多