Ruby 平均每五项设置一次,但顺序不均匀

Ruby 平均每五项设置一次,但顺序不均匀,ruby,Ruby,我收集了100件物品 在一次迭代中,我想在20%的项目上将object属性设置为true 但我不希望“真”的设置均匀出现,即每五个项目出现一次 只要设置不均匀,即使不完全是20%也可以设置为true。您可以使用: 您可以使用: 实现这一点的一种低效但简洁的方法是洗牌数组,对前20个元素进行切片,然后设置它们的属性 items.shuffle[0..19].each do |item| item.foo = true end 如果您关心效率,您可能需要考虑修改算法。一种效率低下但简洁的方法是

我收集了100件物品

在一次迭代中,我想在20%的项目上将object属性设置为
true

但我不希望“真”的设置均匀出现,即每五个项目出现一次

只要设置不均匀,即使不完全是20%也可以设置为true。

您可以使用:

您可以使用:


实现这一点的一种低效但简洁的方法是洗牌数组,对前20个元素进行切片,然后设置它们的属性

items.shuffle[0..19].each do |item|
  item.foo = true
end

如果您关心效率,您可能需要考虑修改算法。

一种效率低下但简洁的方法是洗牌数组,对前20个元素进行切片,然后设置它们的属性

items.shuffle[0..19].each do |item|
  item.foo = true
end

如果您关心效率,您可能需要考虑修改算法。

如果您正在生成阵列:

ary = Array.new(2, true) + Array.new(8, false)
ary # => [true, true, false, false, false, false, false, false, false, false]
ary.shuffle # => [false, false, true, false, false, false, false, false, false, true]
这仅使用10个元素作为示例,但我相信您可以找到调整计数的方法

以上内容可简化为:

ary = (Array.new(2, true) + Array.new(8, false)).shuffle
# => [false, false, true, false, true, false, false, false, false, false]
ary = (([true] * 2) + ([false] * 8)).shuffle
# => [false, false, false, true, false, false, true, false, false, false]
这可以归结为:

ary = (Array.new(2, true) + Array.new(8, false)).shuffle
# => [false, false, true, false, true, false, false, false, false, false]
ary = (([true] * 2) + ([false] * 8)).shuffle
# => [false, false, false, true, false, false, true, false, false, false]
如果是预先存在的阵列:

ARRAY_SIZE = 10
ary = [false] * ARRAY_SIZE
然后可以对其进行切片并重新分配所需的
true
元素数:

ary[0, (ARRAY_SIZE * 0.20).to_i] = [true] * (ARRAY_SIZE * 0.20)
ary # => [true, true, false, false, false, false, false, false, false, false]
然后将其洗牌

ary.shuffle # => [true, false, false, false, false, false, false, false, false, true]

如果要生成阵列,请执行以下操作:

ary = Array.new(2, true) + Array.new(8, false)
ary # => [true, true, false, false, false, false, false, false, false, false]
ary.shuffle # => [false, false, true, false, false, false, false, false, false, true]
这仅使用10个元素作为示例,但我相信您可以找到调整计数的方法

以上内容可简化为:

ary = (Array.new(2, true) + Array.new(8, false)).shuffle
# => [false, false, true, false, true, false, false, false, false, false]
ary = (([true] * 2) + ([false] * 8)).shuffle
# => [false, false, false, true, false, false, true, false, false, false]
这可以归结为:

ary = (Array.new(2, true) + Array.new(8, false)).shuffle
# => [false, false, true, false, true, false, false, false, false, false]
ary = (([true] * 2) + ([false] * 8)).shuffle
# => [false, false, false, true, false, false, true, false, false, false]
如果是预先存在的阵列:

ARRAY_SIZE = 10
ary = [false] * ARRAY_SIZE
然后可以对其进行切片并重新分配所需的
true
元素数:

ary[0, (ARRAY_SIZE * 0.20).to_i] = [true] * (ARRAY_SIZE * 0.20)
ary # => [true, true, false, false, false, false, false, false, false, false]
然后将其洗牌

ary.shuffle # => [true, false, false, false, false, false, false, false, false, true]

假设你有数组

a = Array.new(21) { |i| i }
  #=> [0, 1, 2, 3,..., 19, 20]
而你想做出准确的选择

(a.size/5.0).round #=> 4
元素是随机的。然后你可以写:

@lucky_ones = [*(0...a.size)].sample((a.size/5.0).round)
  #=> [6, 12, 3, 9]

a.each_with_index do |e,i|
  puts "Wow! I've been selected. I'm #{e}" if @lucky_ones.include? i
end

Wow! I've been selected. I'm 3
Wow! I've been selected. I'm 6
Wow! I've been selected. I'm 9
Wow! I've been selected. I'm 12

假设你有数组

a = Array.new(21) { |i| i }
  #=> [0, 1, 2, 3,..., 19, 20]
而你想做出准确的选择

(a.size/5.0).round #=> 4
元素是随机的。然后你可以写:

@lucky_ones = [*(0...a.size)].sample((a.size/5.0).round)
  #=> [6, 12, 3, 9]

a.each_with_index do |e,i|
  puts "Wow! I've been selected. I'm #{e}" if @lucky_ones.include? i
end

Wow! I've been selected. I'm 3
Wow! I've been selected. I'm 6
Wow! I've been selected. I'm 9
Wow! I've been selected. I'm 12

请向我们展示示例输入数据,以及您编写的预期输出和代码。如果没有它,您似乎正在寻找人为您编写代码的人。您是生成该集合还是从某处加载它?请向我们展示示例输入数据,以及您编写的预期输出和代码。如果没有它,您似乎在寻找人为您编写代码的人。您是生成该集合还是从某处加载它?洗牌100项应该相当快。洗牌100项应该相当快。