在Ruby中生成非重复随机数

时间:2012-02-26 22:28:39

标签: ruby random

我想生成一个介于100和999之间的唯一随机数序列。我想确保没有生成两次数字,以确保每个数字都是唯一的。这就是我想出的。这是行不通的。当我运行它时,屏幕只是空白。任何人都可以帮助我吗?

products = {}

def random_key(products)

  rand_key = rand(900) + 100

  while products.has_key?(rand_key)

    rand_key = rand(900) + 100

  end

end

puts random_key(products)

4 个答案:

答案 0 :(得分:13)

a = (100..999).to_a.shuffle 

然后每次你需要一个新的身份

new_id = a.pop

这可以保证数字永远不会被重用。当然,当你用完阵列上的元素时,你会遇到问题。

答案 1 :(得分:0)

请注意,方法中的最后一个语句是while循环,如果products为空,则不会执行。因此函数返回nil

试试这样:

products = {}

def random_key(products)

  rand_key = rand(900) + 100

  while products.has_key?(rand_key)

    rand_key = rand(900) + 100

  end

  rand_key

end

puts random_key(products)

但请注意,一旦100到999之间的所有数字都在products

,这有可能进入无限循环

答案 2 :(得分:0)

您的函数返回while表达式,该表达式始终为nil。您应该返回该号码:

def random_key(products)
  rand_key = rand(900) + 100
  while products.has_key?(rand_key)
    rand_key = rand(900) + 100
  end
  rand_key
end

请注意,您可以在密钥生成后放置“while”来删除重复:

def random_key(products)
  begin
    rand_key = rand(900) + 100
  end while products.has_key?(rand_key)
  rand_key
end

您可以省略begin end表示单个表达式

def random_key(products)
  rand_key = rand(900) + 100 while products.has_key?(rand_key)
  rand_key
end

答案 3 :(得分:0)

我相信Marc Talbot的回答很棒!但是,根据您的情况给出答案,让我们来解释一下,

首先,创建ID。

on_epoch_end

现在,您可以避免使用val_accuracy,方法,ids = (100..999).to_a.shuffle 等,而只需调用while

has_key?

最终的代码版本是:

ids.pop

结果将是:

products[ids.pop] = {}