zoukankan      html  css  js  c++  java
  • SQL生成一柱双色球

    数据库环境:SQL SERVER 2005

    以前用C/JAVA穷举双色球的所有排列,今天想着换成用SQL实现,只生成一柱双色球。

    简单说下双色球的规则,双色球由红色球和蓝色球组成,每注投注号码由6个红色球号码和1个蓝色球号码组成。

    红色球号码从1--33中选择;蓝色球号码从1--16中选择。同时,一柱号码中,蓝色球不能出现在红色球里。

    规则讲完了,我们来看实现,直接上代码,代码里有注释,应该都能看懂

    /*生成1-33个号码的球*/
    WITH    x0
              AS ( SELECT   number AS ball
                   FROM     master.dbo.spt_values
                   WHERE    type = 'P'
                            AND number <= 33
                            AND number >= 1
                 ),/*随机生成6个红色球*/
            x1
              AS ( SELECT TOP 6
                            ball
                   FROM     x0
                   ORDER BY NEWID()
                 )
        SELECT  redball AS 红色球 ,
                ( /*生成蓝色球*/ SELECT TOP 1
                                    ball
                            FROM    x0
                            WHERE   ball <= 16
                                    AND ball NOT IN ( SELECT    ball
                                                      FROM      x1 )
                            ORDER BY NEWID()
                ) AS 蓝色球
        FROM    ( /*将红色球排到一行*/ SELECT   REPLACE(( SELECT    CAST(ball AS VARCHAR)
                                                            + ','
                                                  FROM      x1
                                                FOR
                                                  XML PATH('')
                                                ), ',', ' ') AS redball
                ) t

    这样就实现了吗???

    没有!!!

    这里挖了一个坑,我们先看下意外的结果

    蓝色球和红色球出现重号

    问题就出现在我用cte生成随机的6个红色球,每次调用x1的时候,这6个数都会随机生成,所以,才会出现这样的结果。

    问题已经查明了,我们把6个红色球存到临时表里头,就不会每次调用的时候会发生改变。

    更改后的SQL如下:

    /*生成1-33号码的球*/
    SELECT  number AS ball
    INTO    #t0
    FROM    master.dbo.spt_values
    WHERE   type = 'P'
            AND number <= 33
            AND number >= 1
    /*生成6个红色球*/        
    SELECT TOP 6
            ball
    INTO    #t1
    FROM    #t0
    ORDER BY NEWID()
    
    SELECT  redball AS 红色球 ,
            ( /*生成蓝色球*/ SELECT TOP 1
                                ball
                        FROM    #t0
                        WHERE   ball <= 16
                                AND ball NOT IN ( SELECT    ball
                                                  FROM      #t1 )
                        ORDER BY NEWID()
            ) AS 蓝色球
    FROM    ( /*将红色球排到一行*/ SELECT   REPLACE(( SELECT    CAST(ball AS VARCHAR)
                                                        + ','
                                              FROM      #t1
                                            FOR
                                              XML PATH('')
                                            ), ',', ' ') AS redball
            ) t

     经网友Yuanet在评论中提醒,双色球的规则,蓝色球是可以出现在红色球中的

    因此,我对原来的代码做一些改动,使计算结果符合双色球的规则。

    /*生成1-33个号码的球*/
    WITH    x0
              AS ( SELECT   number AS ball
                   FROM     master.dbo.spt_values
                   WHERE    type = 'P'
                            AND number <= 33
                            AND number >= 1
                 ),/*随机生成6个红色球*/
            x1
              AS ( SELECT TOP 6
                            ball
                   FROM     x0
                   ORDER BY NEWID()
                 )
        SELECT  redball AS 红色球 ,
                CAST(RAND()*16+1 AS INT) AS 蓝色球
        FROM    ( /*将红色球排到一行*/ SELECT   REPLACE(( SELECT    CAST(ball AS VARCHAR)
                                                            + ','
                                                  FROM      x1
                                                FOR
                                                  XML PATH('')
                                                ), ',', ' ') AS redball
                ) t
  • 相关阅读:
    课堂作业之公文流转
    统计字符出现频率(java)
    课堂测试第八周
    HTML学习笔记——语法+骨架
    HTTP协议
    MVC架构模式概述
    CodeIgniter框架——CI中视图路径问题
    CodeIgniter框架——CI组件间信息流走向
    CodeIgniter框架——数据库类(配置+快速入门)
    chm文件无法阅读
  • 原文地址:https://www.cnblogs.com/boss-he/p/4655594.html
Copyright © 2011-2022 走看看