首页  >  问答  >  正文

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

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

曾经蜡笔没有小新曾经蜡笔没有小新2670 天前1074

全部回复(5)我来回复

  • 仅有的幸福

    仅有的幸福2017-06-28 09:25:14

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

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

    回复
    0
  • 某草草

    某草草2017-06-28 09:25:14

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

    回复
    0
  • 阿神

    阿神2017-06-28 09:25:14

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

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

    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();
                }
            }
        }
    }

    回复
    0
  • 大家讲道理

    大家讲道理2017-06-28 09:25:14

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

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

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

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

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

    回复
    0
  • 怪我咯

    怪我咯2017-06-28 09:25:14

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

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

    回复
    0
  • 取消回复