用随机值填充数组

Fill Arrays with random values

本文关键字:数组 填充 随机      更新时间:2023-09-26

我有两个1D数组,我想在Processing中用10个唯一的随机x,y值填充它们。

例如:

x  y 
-  -
3, 9
2, 4
6, 2
7, 5

我的阵列是:

表1X值和

表2的Y值。

我的问题是,如果数字3,9已经存在,我不希望9,3存储在数组中。

我可以确定x,y值(或y,x)何时已经存在,但一旦我替换它,我就无法检查生成的随机数是否存在于以前的索引中。

这就是我迄今为止所尝试的。但是,如果存在3个值aldready,数组Table1和Table2将只存储7个值,而不是10个值。

for (int i=0; i<10; i++) {       
   x=(int)random(6);
   y=(int)random(6);
 if  ((Table1[i] != x && Table2[i] != y) || (Table1[i] != y && Table2[i] != x))
   {
    Table1[i] = x; 
    Table2[i] = y;
   }   

有什么办法控制它吗?

我只能想到两种实现它的方法,没有一种是理想的。

  • 检查您生成的数字是否已经存在,如果是这样,请生成其他数字,直到获得唯一的组合。它可能很昂贵,可能性很小,因为它是随机的,如果你很不幸,你甚至可能以无限循环结束
  • 创建一个包含所有可能组合的数组。然后,您将不生成随机数,而是向该数组生成一个随机索引([0;array.length[中的一个整数)。之后,您必须从数组中删除选定的组合(这样它就不会用于下一个循环),以及它的倒数(如果您选择(9;3),则必须删除(9;4)and(3;9))

我有这段代码可能会对你有所帮助,

首先声明您的数组:

var a = [];
var b = [];

然后你可以调用一个为你做所有事情的函数

fill(a,b)

这个函数的定义应该是这样的:

function fill(a, b) { 
       var arr = [];
       while(arr.length<10) {
             var pair = randomPair();
             if (arr.indexOf(pair.join(','))==-1 || arr.indexOf(pair.reverse().join(','))==-1) {
                a.push(pair[0]);
                b.push(pair[1]);
                arr.push(pair.join(','));
             }
       }
    }

则所使用的其他函数的定义为:

function randomPair () { 
   return [ parseInt(Math.random()*7) , parseInt(Math.random()*7) ]
}

因此,很明显,randomPair函数返回2个值x和y。fill函数测试该对是否已经存在,是否按正常顺序或相反顺序存在。如果没有,它添加了a和b,它们是对主数组的引用;

我看不到其他选项,可以再次走到整个数组,检查它们是否包含新生成的值。