ITPUB论坛-中国最专业的IT技术社区

 
 注册
热搜:
查看: 839|回复: 3

[每日一题] PL/SQL Challenge 每日一题:2018-3-14 DBMS_RANDOM

[复制链接]
论坛徽章:
486
秀才
日期:2015-09-09 10:33:01秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21
跳转到指定楼层
1#
发表于 2018-3-17 08:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。

每两周的优胜者可获得itpub奖励的技术图书一本。

以往旧题索引:
/forum.php?m ... eid&typeid=1808

原始出处:


作者:Steven Feuerstein

运行环境:SQLPLUS, SERVEROUTPUT已打开
注:本题给出答案时候要求给予简要说明才能得到奖品

我执行了这些语句:

CREATE TABLE qz_random_values1 (rval NUMBER)
/

CREATE TABLE qz_random_values2 (rval NUMBER)
/

哪些选项执行之后,再执行如下的查询,会显示 "DIFFERENT" ?

SELECT CASE WHEN COUNT (*) > 0 THEN 'DIFFERENT' ELSE 'SAME' END random_set
  FROM (SELECT rval FROM qz_random_values1
        MINUS
        SELECT rval FROM qz_random_values2)
/

注意:每个选项都有相同的两个INSERT语句。

(A)
BEGIN
   DBMS_RANDOM.seed (val => 'Steven');

   INSERT INTO qz_random_values1
          SELECT DBMS_RANDOM.VALUE (1, 100)
            FROM DUAL
      CONNECT BY LEVEL < 6;

   DBMS_RANDOM.seed (val => 'Steven');

   INSERT INTO qz_random_values2
          SELECT DBMS_RANDOM.VALUE (1, 100)  
            FROM DUAL
      CONNECT BY LEVEL < 6;
END;
/

(B)
BEGIN
   DBMS_RANDOM.seed (val => 'Steven');

   INSERT INTO qz_random_values1
          SELECT DBMS_RANDOM.VALUE (1, 100)
            FROM DUAL
      CONNECT BY LEVEL < 6;

   INSERT INTO qz_random_values2
          SELECT DBMS_RANDOM.VALUE (1, 100)
            FROM DUAL
      CONNECT BY LEVEL < 6;
END;
/

(C)
BEGIN
   INSERT INTO qz_random_values1
          SELECT DBMS_RANDOM.VALUE (1, 100)
            FROM DUAL
      CONNECT BY LEVEL < 6;

   INSERT INTO qz_random_values2
          SELECT DBMS_RANDOM.VALUE (1, 100)
            FROM DUAL
      CONNECT BY LEVEL < 6;
END;
/

(D)
BEGIN
   DBMS_RANDOM.seed (val => 'Steven');

   INSERT INTO qz_random_values1
          SELECT DBMS_RANDOM.VALUE (1, 100)
            FROM DUAL
      CONNECT BY LEVEL < 6;

   DBMS_RANDOM.seed (val => 'STEVEN');

   INSERT INTO qz_random_values2
          SELECT DBMS_RANDOM.VALUE (1, 100)
            FROM DUAL
      CONNECT BY LEVEL < 6;
END;
/

论坛徽章:
135
秀才
日期:2015-11-23 09:48:22秀才
日期:2016-02-18 09:23:46秀才
日期:2016-02-18 09:24:302016猴年福章
日期:2016-02-18 09:31:30秀才
日期:2016-02-18 09:39:10秀才
日期:2016-02-18 10:06:46秀才
日期:2016-02-18 10:08:02秀才
日期:2016-02-18 10:08:14秀才
日期:2016-03-01 09:57:08天蝎座
日期:2016-03-18 14:23:56
2#
发表于 2018-3-19 09:16 | 只看该作者
B,C,D
A设置一样的种子,发出一样的丫丫
B,C差不多,严格来说应该有一定的几率得到一样的随机数,但几率无限趋近于0,算他们对了
D设置两个不同的随机数种子,确保产生不同的随机数,没有一丝漏洞

使用道具 举报

回复
论坛徽章:
7
懒羊羊
日期:2018-02-27 22:52:20秀才
日期:2018-03-01 10:05:18秀才
日期:2018-03-01 10:13:04秀才
日期:2018-03-01 10:13:04秀才
日期:2018-03-01 10:13:04秀才
日期:2018-03-01 10:21:25举人
日期:2018-03-01 10:25:45
3#
发表于 2018-3-19 09:28 | 只看该作者
答案BCD,主要是对DBMS_RANDOM.seed()用法的考量,想要获取相同的值,应该是要在DBMS_RANDOM.VALUE ()前面加相同DBMS_RANDOM.seed()
BC少掉了DBMS_RANDOM.seed()
D参数不一致,也会产生不同的随机数

使用道具 举报

回复
论坛徽章:
486
秀才
日期:2015-09-09 10:33:01秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21
4#
 楼主| 发表于 2018-3-20 04:13 | 只看该作者
答案BCD,2楼得奖。

A: "SAME" 将会被显示,因为我用了相同的种子值来驱动伪随机值的生成。
B: "DIFFERENT" 将会被显示,因为我只有一次指定了种子值,它被用于两个insert,所以会生成不同的随机值。
C: "DIFFERENT" 将会被显示,因为我根本没有指定种子值,而是把它交给Oracle替我完成,这就意味着同一个种子值会被用于两个insert(并且未被重置),所以会生成不同的随机值。
D: "DIFFERENT" 将会被显示,因为我在每次INSERT之前指定了一个不同的种子值。是的,种子值是大小写敏感的!

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 |
  | | |
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表