SQL中怎么获取一组总和固定的随机数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL中怎么获取一组总和固定的随机数相关的知识,希望对你有一定的参考价值。

例如:想要20个总和为100的数据数.即创建一个临时表#TABLE,这个临时表只有一列20行数值型的数据,这20行的数据总和为100

1、以某整数字段为种子(没有的话要生成一个)
2、通过RAND函数生成一个0-1之间的随机数。如0.7136106261841817
3、然后转换成文本型
4、再取后7位即可RIGHT(CONVERT(VARCHAR,RAND(序号)),7) 。
具体语句如下:
如果表中有一个字段为整型的序号或标识列,那么就可以以序号为种子生成随机的学号字段。
UPDATE TABLENAME SET 学号=RIGHT(CONVERT(VARCHAR,RAND(序号)),7) WHERE 序号 IS NOT NULL
如果没有整型的序号或标识列,就要根据表中能够唯一标识确定某行的关键字段来生成学号,如ID
UPDATE TABLENAME SET 学号=RIGHT(CONVERT(VARCHAR,rand((select count(1) from tablename a where a.id>=tablename.id))),7)
参考技术A 总和是100 ,你可以用100,每次生成一个数来减就可以了啊 参考技术B 你在一个范围内随机取的19个数,再计算出第20个数就行了。追问

那岂不是前19个数都小于20,而第20个数也会过大,有点不平衡的感觉。

追答

不会的,如果20个不重复的整数,相加的值是210,大于100,所以这20个数只能是有正有负的,所以这个就变成 在一定范围内,随机取19个数,有正有负,再计算出第20个数。

本回答被提问者采纳

论 Java 中获取一组不重复的随机数之性能问题

今天在做一个Java项目, 用到了使用一组不重复的随机数问题, 不管怎么做随机数里面总有几个是重复的.

于是上网去找资料, 在网上找到的资料中大部分都是一个思路:

网上的思路一:(性能不理想)

先生成一个随机数, 然后在生成下一个随机数的时候和以前的随机数进行匹配, 如果里面有当前生成的随机数, 那么重新去生成, 直到之前所生成的随机数组中没有当前所生成的那个数字为止. 这样做虽然能实现生成一组不重复的随机数, 但是性能不是很理想, 假如我们需要生成10个数字, 在生成第一的时候, 不用匹配, 在生成第二的时候和第一个匹配, 由于是随机数, 那么他的重复几率为 1 /10, 生成第三个的时候和第一个第二个进行匹配, 他的重复几率为 2 /10, 在生成最后一个的时候要和之前的前9个进行匹配, 那么最后一个生成的数就有 9 / 10 的几率和之前的数字重复, 由于10分之9的几率已经接近了1, 也就是说, 生成随机数的时候越往后重复的几率越接近1, 需要重新生成的次数越多,性能越差.

我分析的思路二:

我的思路是, 只生成一次随机数作为模板, 里面是有重复的, 在生成的过程中把这组数字按顺序放到一个集合里, 然后把这组随机数和集合中的数进行匹配, 把在集合中存在的那些随机数给移除掉, 那么集合中就剩下了随机数组中没有的数字了, 最后把随机数组中两个重复的最后一个数字换成集合中的第一个数字, 再把集合的第一个移除掉, 如此类推, 直到集合中的数字用完为止. 

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        //网上方法获取不重复随机数
        testA(10000);
        //自定义方法获取不重复随机数
        testB(10000);
    }

    //自定义方法获取不重复随机数
    private static void testB(int sz){
        long startTime=System.currentTimeMillis(); //开始测试时间
        Random rd = new Random();
        int[] rds = new int[sz];//随机数数组
        int n = 0;//序号
        List<Integer> lst = new ArrayList<Integer>();//存放有序数字集合
        //获取随机数数组, 里面有重复数字
        while (n < rds.length) {
            lst.add(n);
            rds[n++] = (int)(rd.nextFloat() * sz);
        }
        //把随机数和有序集合进行匹对, 把随机数在集合出现的数字从集合中移除掉.
        for (int i = 0; i < rds.length; i++) {
            for (int j = 0; j < lst.size(); j++) {
                if (rds[i] == lst.get(j)) {
                    lst.remove(j);
                    break;
                }
            }
        }
        //把数组中重复的第二个数字用集合的第一个数字替换掉, 并移除掉数组的第一个数字
        for (int i = 0; i < rds.length; i++) {
            for (int j = 0; j < rds.length; j++) {
                if (i != j && rds[i] == rds[j]) {
                    rds[j] = lst.get(0);
                    lst.remove(0);
                    break;
                }
            }
        }
        //得到的  rds  数组就是不重复的随机数组
        long endTime=System.currentTimeMillis(); //获取结束时间 
        System.out.println("自定义代码运行时间: "+(endTime-startTime)+"ms"); 
    }
    //网上方法获取不重复随机数
    private static void testA(int sz){
        long startTime=System.currentTimeMillis(); //开始测试时间
        Random random = new Random();
        int a[] = new int[sz];
        for (int i = 0; i < a.length; i++) {
            a[i] = random.nextInt(sz);
            for (int j = 1; j < i; j++) {
                while (a[i] == a[j]) {//如果重复,退回去重新生成随机数
                    i--;
                }
            }
        }
        long endTime=System.currentTimeMillis(); //获取结束时间 
        System.out.println("网上思路代码运行时间: "+(endTime-startTime)+"ms"); 
    }

当测试数字越大越能体现出效果.

以上有不足的地方还请大家见谅!

 

以上是关于SQL中怎么获取一组总和固定的随机数的主要内容,如果未能解决你的问题,请参考以下文章

选择 n 个总和固定的数字

在SQL中怎么样获取随机数

论 Java 中获取一组不重复的随机数之性能问题

Mysql动态生成字母+固定位数的随机数

在C语言中如何固定字符的长度

获取随机条目的 SQL 查询