如何每次随机出不同的数-Math.random()

随机数用起来确实很好,但是若你想随机出的数均不同于之前的,那就有些麻烦。。。需要判断当前的随机数是否与之前的相同,这是一个很简单的方法,但是他并不适合于程序媛!我们要更高大上!

假如,我们要随机出五个不同的数(范围是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

若有错误或不清楚的地方,请评论我会及时更正。
欢迎分享更好的方法。

你可能感兴趣的:(java算法,java,算法)