2017-04-05 33 views
2

我需要對整數x(至少4位或更多位數)的數字進行隨機重新排序。以下類型的工作,但不能確保在重新排序的值開始時零不會出現。隨機重新排列整數的數字(但'0'不應該在開始處)

如果零成爲初始值,那麼重新排序的整數將會有更少的nchar這正是我想要避免的。

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

我還沒有試過,但我可以用for循環做到這一點。然而,在我嘗試之前,我想看看是否有更好的方法來重新排序整數的數字,同時確保零不會放在重新排序的整數的開頭。

+0

'x = 0'時的預期行爲是什麼? –

+0

@aryamccarthy,'x'將始終有4位以上的數字。 –

回答

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. 生成一個隨機置換

  2. 將其循環移位以使其以第一個非零el EMENT(成爲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"