我需要随机重新排序整数x
的数字(至少4位或更多位)。以下类型的工作,但不确保零永远不会出现在重新排序的值的开头。
如果零成为初始值,则重新排序的整数将少nchar
,这正是我想要避免的。
x = 357230434L
set.seed(42)
as.integer(paste(sample(unlist(strsplit(as.character(x),""))), collapse = ""))
#[1] 437324035
我还没有尝试,但我可以用for
循环来做。但是,在我尝试之前,我想看看是否有更好的方法来重新排序整数的数字,同时确保零永远不会放在重新排序的整数的开头。
答案 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)
我参加聚会有点晚了,但这是另一种方法:
生成随机排列
循环移动以使其以第一个非零元素开始(01234
变为12340
)
代码:
# 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"