Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails:固定长度的随机唯一数组_Ruby On Rails_Ruby_Ruby On Rails 5 - Fatal编程技术网

Ruby on rails Rails:固定长度的随机唯一数组

Ruby on rails Rails:固定长度的随机唯一数组,ruby-on-rails,ruby,ruby-on-rails-5,Ruby On Rails,Ruby,Ruby On Rails 5,如何确保此数组中的唯一性,同时将其长度保持在5 这种行为似乎很奇怪: 一种方法是生成一个从0到10的数字范围,然后 然后洗牌得到唯一的随机数 您可以使用将该范围转换为数组,并使用 您可以这样做: 0..10.洗牌[0..4]=>[8,6,1,9,10] [0..4]将为您提供前5个无序元素 希望能有帮助 一种方法是生成一个从0到10的数字范围,然后 然后洗牌得到唯一的随机数 您可以使用将该范围转换为数组,并使用 您可以这样做: 0..10.洗牌[0..4]=>[8,6,1,9,10] [0..4

如何确保此数组中的唯一性,同时将其长度保持在5

这种行为似乎很奇怪:

一种方法是生成一个从0到10的数字范围,然后 然后洗牌得到唯一的随机数

您可以使用将该范围转换为数组,并使用

您可以这样做:

0..10.洗牌[0..4]=>[8,6,1,9,10] [0..4]将为您提供前5个无序元素

希望能有帮助

一种方法是生成一个从0到10的数字范围,然后 然后洗牌得到唯一的随机数

您可以使用将该范围转换为数组,并使用

您可以这样做:

0..10.洗牌[0..4]=>[8,6,1,9,10] [0..4]将为您提供前5个无序元素

希望有帮助。

使用SecureRandom

如果您想生成1到10之间的唯一数字,那么您可以创建1到10的数组,并使用shuffle或sample获得随机数

使用

使用

您还可以将SecureRandom自定义随机生成器作为参数传递给sample

使用SecureRandom

如果您想生成1到10之间的唯一数字,那么您可以创建1到10的数组,并使用shuffle或sample获得随机数

使用

使用

您还可以将SecureRandom自定义随机生成器作为参数传递给sample


当可能值的数量很小时(如您的示例中的10),我将生成一个包含所有选项的数组,然后随机选取一组条目:

(0..9).to_a.sample(5)
如果可能值的数量很大,那么首先生成所有值肯定不是一个选项。然后,只要数组中没有足够的条目,我就会生成一个随机值:

require 'set'
values = Set.new
until values.length == 5 do
  values.add(SecureRandom.random_number(1_000_000))
end
values.to_a

请注意,我使用a来确保第二个版本中的值的唯一性。

当可能值的数量很小时(如您的示例中的10个),我将生成一个包含所有选项的数组,并随机选择一个条目:

(0..9).to_a.sample(5)
如果可能值的数量很大,那么首先生成所有值肯定不是一个选项。然后,只要数组中没有足够的条目,我就会生成一个随机值:

require 'set'
values = Set.new
until values.length == 5 do
  values.add(SecureRandom.random_number(1_000_000))
end
values.to_a

请注意,在第二个版本中,我使用a来确保值的唯一性。

只是出于好奇,使用了无限生成器

MAX = 10
SIZE = 5

[MAX].cycle.inject(Set.new) do |acc, max|
  break acc if acc.size >= SIZE
  acc << SecureRandom.random_number(max)
end
#⇒ #<Set: {2, 1, 7, 0, 9}>

只是出于好奇,使用无限生成器

MAX = 10
SIZE = 5

[MAX].cycle.inject(Set.new) do |acc, max|
  break acc if acc.size >= SIZE
  acc << SecureRandom.random_number(max)
end
#⇒ #<Set: {2, 1, 7, 0, 9}>

您想要一个由5个数字组成的数组,这些数字是在0到10之间随机生成的吗?需要更清楚地了解需要什么。此问题可能不需要您执行。请提供一些预期样本输出的示例。是否需要一个由5个数字组成的数组,这些数字是在0和10之间随机生成的?需要更清楚地了解需要什么。此问题可能不需要您执行。请提供一些预期样本输出的示例。但是这些数字在输出中不是唯一的。这是条件之一。@Abhishek77中的数字将是唯一的。在第一个版本中,sample仅返回范围中的唯一索引,在第二个版本中,使用集合只保证唯一值,并加快重复检查的速度。为什么您认为不会?您和我的解决方案在接近最大值时效率极低。在接近最大值时,您的解决方案更容易调整为1..max.to_a-值,其中值按原样计算,但被视为不需要的值。@Spickerman数组中的每个数字都必须是唯一的。这是一个非常聪明的解决方案,但数组中的每个数字在这两种情况下都不是唯一的。@abhishek77in:你说每个数字都必须是唯一的,而我的解决方案不是唯一的,这是什么意思?在两个版本中都不会有重复,我认为这就是唯一性的定义。这是由样本和集合的使用保证的。我不明白你认为什么是错的。请详细说明。但是数字在输出中不是唯一的。这是条件之一。@Abhishek77中的数字将是唯一的。在第一个版本中,sample仅返回范围中的唯一索引,在第二个版本中,使用集合只保证唯一值,并加快重复检查的速度。为什么您认为不会?您和我的解决方案在接近最大值时效率极低。在接近最大值时,您的解决方案更容易调整为1..max.to_a-值,其中值按原样计算,但被视为不需要的值。@Spickerman数组中的每个数字都必须是唯一的。这是一个非常聪明的解决方案,但数组中的每个数字在这两种情况下都不是唯一的。@abhishek77in:你说每个数字都必须是唯一的,而我的解决方案不是唯一的,这是什么意思?在两个版本中都不会有重复,我认为这就是唯一性的定义。这是由样本和集合的使用保证的。我不明白你认为什么是错的。P 租赁。无论您是否使用循环,它都不需要嵌套;用循环检查我的答案以获得干净的解决方案。无论是否使用循环,它都不需要嵌套;用loop检查我的答案中的干净溶液。
(0..9).to_a.sample(5)
require 'set'
values = Set.new
until values.length == 5 do
  values.add(SecureRandom.random_number(1_000_000))
end
values.to_a
MAX = 10
SIZE = 5

[MAX].cycle.inject(Set.new) do |acc, max|
  break acc if acc.size >= SIZE
  acc << SecureRandom.random_number(max)
end
#⇒ #<Set: {2, 1, 7, 0, 9}>
loop.each_with_object(Set.new) do |_, acc|
  break acc if acc.size >= SIZE
  acc << SecureRandom.random_number(10)
end
#⇒ #<Set: {2, 6, 7, 1, 3}>