在数组中创建偶数量的随机性

时间:2012-09-02 01:16:34

标签: java random

让我们说你有一个任意大尺寸的二维数组,里面有大量的项目。为了清楚起见,我们也假设您只能在两个事物中选择作为给定项目放在数组中。您如何在数组中的给定索引处进行随机选择,但是一旦数组被填充,您在两个选项中的分配是均匀的?

如果对代码有任何答案,则首选Java,但其他语言也可以。

5 个答案:

答案 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的幂。