随机数用起来确实很好,但是若你想随机出的数均不同于之前的,那就有些麻烦。。。需要判断当前的随机数是否与之前的相同,这是一个很简单的方法,但是他并不适合于程序媛!我们要更高大上!
假如,我们要随机出五个不同的数(范围是0~19),将五个随机数存在长度为5的数组ran[]中。
基本思想
我们借助一个长度为20的数组 temp[20] , 初始化为temp[0]=0 , temp[1]=1…temp[19]=19 , 若第一个随机数为5,则让随机数等于以5为下标的temp数组的值,即 ran[0]=temp[5]=5
, 同时将temp[19]的值赋给temp[5] , 即temp[5]=temp[19]=19
。 这时若第二个再随机到5 , 同样让随机数等于以5为下标的temp数组的值,即ran[1]=temp[5]=19
, 再将temp[18]的值赋给temp[5]
注: 第一次的随机范围是0-19,第二次随机的范围是0-18,(不是说随机不到19了 而是temp[19]=19这个值已经被放在刚刚随机到的temp[5]中了,所以说,随机不到的不是19而是5), 这样就解决了随机到相同数的问题。
若是第二次随机到18,其实也是一样的,ran[1]=temp[18]=18; temp[18]= temp[18]=18
,但是到第三次随机时的范围是0-17了,跟temp[18]就没关系了。
总结来说,随机出来的数不是直接填入ran中的,而是作为temp的下标,将temp的值填入ran。
以java为例代码如下:
import java.util.*;
public static main(String[] args){
int temp[] = new int[20];
int ran[] = new int[5];
//初始化数组
for(int i = 0; i < 20; i ++)
{
temp[i] = i;
}
//随机产生五个不同的随机数
for(int k = 0; k < 5; k ++)
{
int myIndex = (int)(Math.random()*(20-k)); //随机数范围每次减少一个
ran[k] = temp[myIndex];
//将随机范围的最后一位作为下标的temp数组的值赋值给temp[myIndex]
temp[myIndex] = temp[20-k-1];
}
for(int x :ran)
{
System.out.print(x+" ");
}
}
输出结果:
18 11 19 17 4
若有错误或不清楚的地方,请评论我会及时更正。
欢迎分享更好的方法。