2016-11-11 94 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