您的位置:首页技术文章
文章详情页

java生成6位不重复随机数,求救各位道友

浏览:87日期:2023-10-24 13:14:12

问题描述

我知道循环下去没有不重复的~,只能降低重复率,但是还是得戳一戳~,有没有道友来一波~

问题解答

回答1:

我认为随机的意义在于前后两次的结果值不可预测,推广说就是知道A1 A2 并不能推算出A3这个意思。你说的重复值的问题应该从概率的角度来衡量,如果每个值获取的概率都是相等的,就属于”随机“的意思了,两次结果重复不能说明这就不够”随机“。

如果一定要严格限定取值不重复,你需要有一个存储的地方,而且这个不重复也一定有个时间或者空间的范围。

回答2:

以前在CSDN上看到随机产生不重复的数字的算法:

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];//把随机数产生过的位置替换为未被选中的值。 } 回答3:

一个笨办法就是直接初始化数组,每个数字对号入座,然后随机挑选,第一次的结果与倒数第一位交换,第二次的结果与倒数第二位交换,当然交换后,下次挑随机数的范围也会相应减一。

至于效率如何,楼主可以执行下。

public static void main(String[] args) { // 初始化数组 int[] arr = new int[1000000]; for (int i = 0; i < arr.length; i++) {arr[i] = i; } int randomCount = 1000; // 要生成多少个随机数 Random random = new Random(); // 随机数生成器 long startTime = System.currentTimeMillis(); // 计时 for (int i = 0; i < randomCount; i++) {// 随机挑选int pickIndex = random.nextInt(arr.length - i);// 交换int t = arr[pickIndex];arr[pickIndex] = arr[arr.length - 1 - i];arr[arr.length - 1 - i] = t; } System.out.println('take time: ' + (System.currentTimeMillis() - startTime) + ' ms'); // 输出结果(超过一万就不输出了,直接看耗时) if (randomCount < 10000) {for (int i = 0; i < randomCount; i++) { System.out.printf('%06d ', arr[arr.length - i - 1]); if (i % 40 == 39) {System.out.println(); }} }}回答4:

生命周期长的话,十万还是很容易就用完的.用完之后再怎么生成也是重复的.

最简单的, Math.random()*10_0000,然后转int.无法保证不重复

递增,类似于mysql的主键递增.从1开始,不足六位的话,前面用0补足

高级点.六位数可以用各种影响因素来进行组合,当然这个位数比较短,可考虑的因素不是很多.

最后,给一个参考链接,分布式系统ID生成. 这个可能跟你的问题没有关系,但是也有一些参考性.

回答5:

ThreadLocalRandom.current().ints(0, 100).distinct().limit(6).forEach(System.out::println);

0到100是范围,6是个数。更重要的是线程安全。

标签: java