随机重新排序整数的数字(但“0”永远不应该在开头)

时间:2017-04-05 22:58:58

标签: r

我需要随机重新排序整数x的数字(至少4位或更多位)。以下类型的工作,但不确保零永远不会出现在重新排序的值的开头。

如果零成为初始值,则重新排序的整数将少nchar,这正是我想要避免的。

x = 357230434L
set.seed(42)
as.integer(paste(sample(unlist(strsplit(as.character(x),""))), collapse = ""))
#[1] 437324035

我还没有尝试,但我可以用for循环来做。但是,在我尝试之前,我想看看是否有更好的方法来重新排序整数的数字,同时确保零永远不会放在重新排序的整数的开头。

2 个答案:

答案 0 :(得分:2)

您是否考虑过多个部分?可能有一种更简单的方法,但一种方法是随机拉出第一个非零字符,然后对其余字符进行采样。类似的东西:

  chars<-unlist(strsplit(as.character(x),""))
  first<-sample(chars[chars!="0"],1)
  as.integer(paste0(c(first,sample(chars[-match(first,chars)])),collapse=""))

用几种不同的种子运行它:

set.seed(42) #447323035
set.seed(43) #243057343
set.seed(44) #472333504
set.seed(45) #475433320
set.seed(46) #570244333

答案 1 :(得分:1)

我参加聚会有点晚了,但这是另一种方法:

  1. 生成随机排列

  2. 循环移动以使其以第一个非零元素开始(01234变为12340

  3. 代码:

    # random permutation
    x2 = sample(unlist(strsplit(as.character(x), ""))) 
    # get the position of the first non-zero character
    p = which(x2 > '0')[1] 
    # make a circular rotation to put the non-zero in front
    x2[(seq_along(x2) + p-2) %% length(x2) + 1] 
    

    此外,不要忘记设置options(scipen=16)或其他大值,否则您将遇到科学记数法的麻烦:

    > as.character(100000000)
    [1] "1e+08"