【问题标题】:Generating a 20-digit number in R在 R 中生成一个 20 位数字
【发布时间】:2013-09-20 18:37:12
【问题描述】:

我想使用 R 生成一个随机的 20 位数字。

我的第一次尝试是做

runif(1,10000000000000000000,9999999999999999999)

但这似乎不起作用,因为 R 不断将 9999999999999999999 舍入为 10000000000000000000。它似乎不接受“9999”数字,直到我下降到 15 位数:

> 9999999999999999999
[1] 10000000000000000000
> 999999999999999999
[1] 1000000000000000000
> 99999999999999999
[1] 100000000000000000
> 9999999999999999
[1] 10000000000000000
> 999999999999999
[1]  999999999999999
> 99999999999999
[1]  99999999999999
> 9999999999999
[1]  9999999999999

有没有更好的方法来解决这个问题?

【问题讨论】:

    标签: r random


    【解决方案1】:

    您可以将此数字生成为字符串:

    paste( sample( 0:9, 20, replace=TRUE ), collapse="" )
    # [1] "40910135645767200675"
    

    【讨论】:

    • 差点忘了前面的0:paste(c(sample(1:9,1), sample( 0:9, 19, replace=TRUE )), collapse="")
    • 根据该号码的使用方式(例如,20 位 PIN 码),可以使用前导零。
    • 在 OP 中有明确的说明
    【解决方案2】:
    set.seed(1)
    sprintf("%20.0f",runif(1,1e19,1e20))
    #[1] "33895779682788999168"
    

    【讨论】:

    • 这可能是平台相关的,但是和机器的精度太接近了:最后一位总是偶数...
    • 起初我以为这是随机生成的,但是当我在我的机器上执行此操作时,我看到了文森特提到的相同问题,它总是均匀
    • 同样的事情发生在我身上。想知道为什么最后一个数字总是偶数吗?
    • 浮点数实际上以二进制形式编码,二进制位数有限。如果我们超过限制,最后的二进制数字被认为是不重要的:它们不被存储,并假定为零。二进制中以 0 结尾的数字是 2 的倍数,以 00 结尾的数字是 4 的倍数,以此类推
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多