java生成6位不重复随机数,求救各位道友
曾经蜡笔没有小新
曾经蜡笔没有小新 2017-06-28 09:23:14
0
5
1128

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

曾经蜡笔没有小新
曾经蜡笔没有小新

全部回复(5)
仅有的幸福

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

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

某草草

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

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

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

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();
            }
        }
    }
}
大家讲道理

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

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

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

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

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

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

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板