int startArray[] = {0,1,2,3,4,5,6,7,8,9};//seed array
int N = 6;//随机数个数
int resultArray[] = new int [N];//结果存放在里面
for(int i = 0; i < N; i++)
{
int seed = random(0, startArray.length - i);//从剩下的随机数里生成
resultArray[i] = startArray[seed];//赋值给结果数组
startArray[seed] = startArray[startArray.length - i - 1];//把随机数产生过的位置替换为未被选中的值。
}
我认为随机的意义在于前后两次的结果值不可预测,推广说就是知道A1 A2 并不能推算出A3这个意思。
你说的重复值的问题应该从概率的角度来衡量,如果每个值获取的概率都是相等的,就属于”随机“的意思了,两次结果重复不能说明这就不够”随机“。
如果一定要严格限定取值不重复,你需要有一个存储的地方,而且这个不重复也一定有个时间或者空间的范围。
以前在CSDN上看到随机产生不重复的数字的算法:
一个笨办法就是直接初始化数组,每个数字对号入座,然后随机挑选,第一次的结果与倒数第一位交换,第二次的结果与倒数第二位交换,当然交换后,下次挑随机数的范围也会相应减一。
至于效率如何,楼主可以执行下。
生命周期长的话,十万还是很容易就用完的.用完之后再怎么生成也是重复的.
最简单的, Math.random()*10_0000,然后转int.无法保证不重复
递增,类似于mysql的主键递增.从1开始,不足六位的话,前面用0补足
高级点.六位数可以用各种影响因素来进行组合,当然这个位数比较短,可考虑的因素不是很多.
最后,给一个参考链接,分布式系统ID生成. 这个可能跟你的问题没有关系,但是也有一些参考性.
0到100是范围,6是个数。更重要的是线程安全。