2016-11-11 58 views
1

我是Ruby新手。我只想知道是否有以下方式創建隨機數的方法:紅寶石。隨機數發生器

1)生成45個隨機數。

2)產生的隨機數可以重複僅最多5次

我使用以下方法嘗試。

45.times do |x| 
    puts x.rand(1..9) 
end 

如何能夠做到一些最大發生在5?

+1

你需要45個隨機數在0到5範圍內嗎? – inaitgaJ

+0

nope。我想創建45個隨機數字。但是如果一個數字達到5以上,請停止在隨機數中使用該數字。 –

+1

@EjayTan你的解釋看起來有點複雜。你想要一個混合數組,其中包含從1到9的每個數字正好5次。 – Stefan

回答

2

我會做這樣的事情:

Array.new(5) { (1..9).to_a }.flatten.shuffle 

這生成其中所有數形式1至9中存在精確至5倍,並隨機混洗陣列的陣列。

numbers = Array.new(5) { (1..9).to_a }.flatten.shuffle 

3.times do 
    puts numbers.pop 
end 

使用pop返回一個數字,並從陣列中刪除:

根據您的需求,你可能會因爲它是或pop從它的下一個隨機數使用此陣。這意味着45圈後numbers陣列將爲空。

+0

也可以使用'Array#*'來避免'flatten'。即:'((1..9).to_a * 5).shuffle' – Stefan

+0

'3.times'應該可能是'45.times'。如果直到數組爲空而不是在那裏具有魔術數字「45」,移除元素會不會更清潔?像'while(n = numbers.pop);放入n; end'。還要注意'pop'移除了_last_元素,這可能是違反直覺的。 – Stefan

+0

@Stefan我完全同意。我的意思是'3.times'部分只是一個例子,如何使用易於粘貼到控制檯中的'pop'。我猜OP不只是想編寫一個程序,將值輸出到控制檯。因此IMO取決於這個隨機排序數組的使用情況,他可能想要如何使用它的內容。但使用'while'肯定比幻數好。你是對的。 – spickermann