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