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

Java 在数组中创建偶数的随机性,java,random,Java,Random,假设您有一个任意大的二维数组,其中包含偶数项。为了清楚起见,我们还假设您只能在两个对象中进行选择,将它们作为给定项放入数组中。如何在数组中的给定索引处放置一个随机选择,但一旦数组被填充,这两个选择之间就会出现偶数分割 如果对代码有任何答案,Java是首选,但其他语言也可以。基本上你可以用相反的方式来思考。您可以从数组中选择n/2个元素,并将第一个值放入其中,而不是为给定的索引确定要放入的值。然后将第二个值放在另一个n/2中。二维A[M,n]数组可以映射到向量V[M*n](可以使用行主顺序或列主顺

假设您有一个任意大的二维数组,其中包含偶数项。为了清楚起见,我们还假设您只能在两个对象中进行选择,将它们作为给定项放入数组中。如何在数组中的给定索引处放置一个随机选择,但一旦数组被填充,这两个选择之间就会出现偶数分割


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

基本上你可以用相反的方式来思考。您可以从数组中选择n/2个元素,并将第一个值放入其中,而不是为给定的索引确定要放入的值。然后将第二个值放在另一个n/2中。

二维
A[M,n]
数组可以映射到向量
V[M*n]
(可以使用行主顺序或列主顺序进行映射)


从向量V[M*N]开始。用第一个选项填充其上半部分,用第二个选项对象填充数组的下半部分。运行洗牌,并将洗牌数组转换为二维数组。现在,数组中填充的元素在两个选项中平均分配,每个特定索引处的选项都是随机的。

下面创建一个
列表
矩阵区域的大小,并用第一个选项(
空格[0]
)填充一半,用第二个选项(
空格[1]
)填充一半。然后,它应用一个洗牌(即Fisher-Yates,via),并开始用这些值填充矩阵

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();
    }
  }
}
静态空隙填充(最终T[][]矩阵,最终T…空间){
最终int w=矩阵长度;
final int h=矩阵[0]。长度;
最终内部面积=w*h;
最终列表样本=新阵列列表(区域);
最终整数一半=面积>>1;
sample.addAll(Collections.nCopies(一半,空格[0]);
sample.addAll(Collections.nCopies(一半,空格[1]);
收集。洗牌(样本);
最终迭代器游标=sample.Iterator();
对于(int x=w-1;x>=0;--x){
最终T[]列=矩阵[x];
对于(int y=h-1;y>=0;--y){
列[y]=游标。下一步();
}
}
}
伪代码:

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);
}
assoc_数组={1=4,2=4,3=4,4=4};
而(!assoc_array.isEmpty())
{
int index=rand(assoc_array.getNumberOfKeys());
int n=assoc_array.getKeyAtIndex(索引);
array.push(n);
关联数组[n]--;

如果(assoc_array[n]听起来你对随机性的要求不是很严格,但我想我会为任何可能从中受益的人提供更多的想法

你基本上要求的是一个伪随机二进制序列,我所知道的最流行的是。它使用一个n位寄存器和一个线性反馈移位寄存器来定义一个1和0的周期序列,它有一个完全平坦的频谱。至少它在一定的范围内是完全平坦的,由序列决定nce的周期(2^n-1位)

这意味着什么?基本上,这意味着序列在所有移位中(因此频率)都是最大随机的如果使用它的全长。与从随机数生成器生成的等长数字序列相比,它将包含比典型随机生成序列更多的每长度随机性

正是由于这个原因,它被用于确定系统白噪声分析中的脉冲函数,特别是当实验时间宝贵且高阶交叉效应不太重要时。由于序列相对于自身的所有移位是随机的,因此其自相关是一个完美的δ函数(除了上面提到的限定词)这样刺激就不会污染刺激和反应之间的相互关系

我真的不知道你对这个矩阵的应用是什么,但如果它只是需要“出现”random这样做会非常有效。就平衡而言,1对0,序列保证比0多1个。因此,如果你试图创建一个2^n的网格,你可以通过在末端加上一个0来保证得到正确的结果


因此,m序列比使用随机数生成器生成的任何序列都更随机,它有一个定义的0和1。但是,它不允许不合格地生成任意大小的2d矩阵-只有网格中元素总数为2的幂次方的矩阵。

不可能进行偶数拆分…好d幸运地通过随机性实现了这一点。然而,有一个接近均匀的分割是更可能的……我想这有点细微差别,但想象一下选择是“校园选择”风格。但不是挑选最好的球员,而是每个人都挑选了一个任意的人。所以你想要一个随机样本,没有替换吗?这听起来不像你原来的帖子。如果我原来的问题用我使用的术语误导,请随意编辑。谢谢,这是一个非常简单的方法,但完全实现了我所需要的。