如何创建一个随机的掩码数组?

3

我有一个包含128个值的数组,每个值都是1:

length = 128
partials = Array.new length

partials.each_index do |i|
    partials[i] = 1
end

我想在某些(随机的)位置上设置值为0(例如,在位置1、6、50、70、100、112、120上)。

当然,每次位置的数量可能不同,如果我选择7个不同的位置,我希望最终有7个不同的位置被改变。

在Ruby中,有什么更快的方法可以做到这一点?


为什么不直接使用Random类呢?http://ruby-doc.org/core-2.2.0/Random.html - Aziuth
根据@Aziuth的评论:7.times{partials[rand(128)]=0}} - Sagar Pandya
我猜你想从有经验的人那里了解最快的方法。 - Sagar Pandya
3
你需要明确你想要什么。 "某个位置" 是什么?你已经知道你想要多少个零,还是也想随机选择?你希望所有可能的模式(2*128种模式)具有相同的出现概率吗?等等。 - cozyconemotel
你是说你想要一个名为rnd_arr的方法,调用rnd_arr(n,z),返回一个包含z个零和n-z个一的数组,使得零(因此也是一)的位置被随机化了吗? - Cary Swoveland
4个回答

6
假设您想要一个具有值“0”的n个元素,您可以执行以下操作:
n = 5
partials[0,n] = [0]*n
partials.shuffle

另外,也可以写成:

partials.tap{|p| p[0,n] = [0]*n}.shuffle

4

您可以将零整合到数组创建中:

length = 128
zeros = 7
partials = Array.new(length) { |i| i < zeros ? 0 : 1 }.shuffle
#=> [1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
#    1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
#    1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1,
#    1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
#    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
#    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
#    1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
#    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

一种变体:([1]*(length-zeroes)).concat([0]*zeroes).shuffle - Cary Swoveland

1
一种方法:

array = 128.times.map{1}

或者随机喷洒0:
array = 128.times.map{rand(2)}

或者稍后加上一些0的数字:
10.times{array[rand(128)]=0}

等等……和它玩耍,看看你需要什么


1
你也可以将一个块传递给Array.new,例如 Array.new(128) { rand(2) } - Stefan

0

另一个选择:

length = 10
zeros = 2

([0]*(length-zeros)+[1]*zeros).shuffle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接