C# 随机数的问题

来源:百度知道 编辑:UC知道 时间:2024/05/27 08:19:48
Label[] lb ={ label1, label2, label3, label4, label5, label6, label7, label8, label9 };
string[] s = new string[9];
Random rd = new Random();
string[] index = new string[9];
for (int i = 0; i <8; i++)
{
index[i] = (i+1).ToString();
}
index[8] = " ";
int size =9;
for (int i = 0; i < s.Length ; i++)
{

int d = rd.Next(0, size-1);
s[i] = index[d];
index[d] = index[size - 1];/*把当前位置用index的最后一个数覆盖..这里为什么?为什么覆盖了就会不重复..*/
size--;

}
//给label赋值
for (int i = 0; i < s.Length ; i++)
{
lb[i].Text= s[i];
}
以上代码根据朋友写的一个随机生成不重复的数的算法...
用于做一个九宫格移动数字的小游戏...
但是有些地方不明白...

1 2 3 4 5 6 7 8
从上面这些数随机取一个数出来放到s[i]中,随机产生的数范围是在0~size(size一开始是size-1,也就是8),假设第一次随机取走了3放到了s[0]中

接着关键在这里,把上面那些数的第size-1个数(size-1也就是上面那些数的第八个数"8")放到刚才取走的那个数里,覆盖掉它,那么现在那些数的变化就是
1 2 8 4 5 6 7 8 然后size--变成了8

第二次循环随机生成的数的范围变成了0~size-1也就是0~7,也就是将会在
1 2 8 4 5 6 7里面随机取走一个放到s[1]里,仔细看一下你觉得可能会在取到3这个数吗?如果这次取走了5,那么就把7覆盖到5变成
1 2 8 4 7 6 7

其实这代码应该是交换值,而不是覆盖,这样比较直观一点,当然效果是一样的

int t = index[d];
index[d] = index[size-1];
index[size-1] = t;
改成这样的话,数的变化规律就是
1 2 3 4 5 6 7 8 第一次取走了3,变成
1 2 8 4 5 6 7 3 第二次取走了6,变成
1 2 8 4 5 7 6 3 .....
以上每次去走一个数,下次随机产生的数的范围都会少一个,那么就是说取走的数放到了最后面,下次产生的随机数就不会访问到它了,就不会重复了

要产生一个真正的随机数i:
Random rnd = new Random();
int i= rnd.Next(0,9);//(0,9)为随机的范围

代码不知道你用来作什么的,但是
index[d] = index[size - 1];这里并不是“把当前位置用index的最后一个数覆盖”仔细看下面
size--;
所以,index[size-1]应该和for循环的i当前值有关系。i越大size越小。
index[d]得到的值应该是index[8到0]。

具体的细节变化你可以设置断点