让我们说你有一个任意大尺寸的二维数组,里面有大量的项目。为了清楚起见,我们也假设您只能在两个事物中选择作为给定项目放在数组中。您如何在数组中的给定索引处进行随机选择,但是一旦数组被填充,您在两个选项中的分配是均匀的?
如果对代码有任何答案,则首选Java,但其他语言也可以。
答案 0 :(得分:1)
你基本上可以以相反的方式思考它。您可以从数组中选择n / 2个元素并将第一个值放入其中,而不是决定给定索引,将哪个值放入其中。然后将第二个值放在另一个n / 2中。
答案 1 :(得分:1)
可以将2-D A[M,N]
数组映射到向量V[M*N]
(您可以使用行主要或列主要顺序来执行映射)。
从矢量V[M*N]
开始。用第一个选项填充它的前半部分,用第二个选择对象填充数组的后半部分。运行Fisher-Yates shuffle,并将混洗数组转换为二维数组。现在,数组中填充的元素在两个选项中均匀分配,每个特定索引的选择都是随机的。
答案 2 :(得分:0)
下面创建一个List<T>
矩阵区域的大小,并用第一个选项(spaces[0]
)填充一半,用第二个选择(spaces[1]
)填充一半。然后,它应用一个shuffle(即Fisher-Yates,通过Collections.shuffle
)并开始用这些值填充矩阵。
static <T> void fill(final T[][] matrix, final T... space) {
final int w = matrix.length;
final int h = matrix[0].length;
final int area = w * h;
final List<T> sample = new ArrayList<T>(area);
final int half = area >> 1;
sample.addAll(Collections.nCopies(half, space[0]));
sample.addAll(Collections.nCopies(half, space[1]));
Collections.shuffle(sample);
final Iterator<T> cursor = sample.iterator();
for (int x = w - 1; x >= 0; --x) {
final T[] column = matrix[x];
for (int y = h - 1; y >= 0; --y) {
column[y] = cursor.next();
}
}
}
答案 3 :(得分:0)
的伪代码:
int trues_remaining = size / 2;
int falses_remaining = size / 2;
while (trues_remaining + falses_remaining > 0)
{
if (trues_remaining > 0)
{
if (falses_remaining > 0)
array.push(getRandomBool());
else
array.push(true);
}
else
array.push(false);
}
但是,实际上并没有真正扩展到两个以上的值。怎么样:
assoc_array = { 1 = 4, 2 = 4, 3 = 4, 4 = 4 };
while (! assoc_array.isEmpty())
{
int index = rand(assoc_array.getNumberOfKeys());
int n = assoc_array.getKeyAtIndex(index);
array.push(n);
assoc_array[n]--;
if (assoc_array[n] <= 0) assoc_array.deleteKey(n);
}
编辑:刚刚注意到你要求一个二维数组。那么应该很容易使这种方法适应n维。
EDIT2:从你上面的评论中,“校园选择”是一个很好的名字。
答案 4 :(得分:0)
听起来你对随机性的要求并不严格,但我认为我会为可能从中受益的人提供更多的想法。
你基本上要求伪随机二进制序列,我所知道的最受欢迎的是maximum length sequence。这使用n位寄存器和线性反馈移位寄存器来定义具有完全平坦频谱的1和0的周期序列。至少它在某些范围内是完全平坦的,由序列的周期(2 ^ n-1位)决定。
这是什么意思?基本上,这意味着如果使用其全长,则保证序列在所有移位(以及因此频率)上最大随机。与从随机数生成器生成的等长数字序列进行比较时,每个长度的随机性比典型的随机生成序列要多。
正是由于这个原因,它被用于确定系统白噪声分析中的脉冲函数,特别是当实验时间有价值且高阶交叉效应不太重要时。因为序列相对于其自身的所有移位是随机的,所以其自相关是完美的delta函数(除了上面指出的限定符之外),因此刺激不会污染刺激和响应之间的互相关。
我真的不知道你对这个矩阵的应用是什么,但是如果它只是需要“随机”出现,那么这将非常有效地做到这一点。在平衡方面,1和0相比,序列保证只有1比0。因此,如果你想创建一个2 ^ n的网格,你可以保证通过添加一个来获得正确的结果。 0到最后。
因此,m序列比使用随机数生成器生成的任何内容更随机,并且它具有定义的0和1的数量。但是,它不允许不合格生成任意大小的2d矩阵 - 只有那些网格中元素总数为2的幂。