主题:[原创]一个产生不重复的一组随机数的算法
最近,在写一个连连看游戏时,自己想出一个关于产生一定范围但不重复的一组随机数的算法:
范围:N--M
int x[M-N];
for(j = N;j <= M;j++)
num[i] = j; //将这个范围(N--M)内的所有数保存于一个数组;
int times = 0; //控制循环次数,即随机数个数;
int head = 0;
while(times <= M-N){
int k=head + (int)( Math.random()*(M-N-head) );
x[i]=num[k]; /*产生一个随机数,并以此数为下标,注意:次下标必然
>=head; */
int temp=num[head]; //把本次产生的数放到x[head]中,
num[head]=num[k]; //即与x[head]中的数交换位置
num[k]-temp;
head++; //head自增,就能保证已经有的数的下标<head;
//从而他们就不会再被产生。
}
该算法的特点就是,每次产生的数,当要求不可重复时(如以次作为连连看游戏中图片显示的位置时)绝对有效的。
我认为它应该是个有用的算法吧,又不难理解,就写出来供大家参考,如果可能,请给点评价,[color=800080][color=000080]好也罢,坏也罢,总会让我有所新的收获的[/color][/color],谢谢了。
范围:N--M
int x[M-N];
for(j = N;j <= M;j++)
num[i] = j; //将这个范围(N--M)内的所有数保存于一个数组;
int times = 0; //控制循环次数,即随机数个数;
int head = 0;
while(times <= M-N){
int k=head + (int)( Math.random()*(M-N-head) );
x[i]=num[k]; /*产生一个随机数,并以此数为下标,注意:次下标必然
>=head; */
int temp=num[head]; //把本次产生的数放到x[head]中,
num[head]=num[k]; //即与x[head]中的数交换位置
num[k]-temp;
head++; //head自增,就能保证已经有的数的下标<head;
//从而他们就不会再被产生。
}
该算法的特点就是,每次产生的数,当要求不可重复时(如以次作为连连看游戏中图片显示的位置时)绝对有效的。
我认为它应该是个有用的算法吧,又不难理解,就写出来供大家参考,如果可能,请给点评价,[color=800080][color=000080]好也罢,坏也罢,总会让我有所新的收获的[/color][/color],谢谢了。