随机获取100以内3个不连续不重复的数字?

stelf 2019-08-15 11:17:52
如题,用sql来实现,或者聊一聊思路。
...全文
368 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我来看思路来了
nayi_224 2019-08-16
  • 打赏
  • 举报
回复
补一个java写法
with cte(lv, idx, rn, times, total_num) as (
select level, level, max(decode(rownum, 1, ceil(dbms_random.value(1, 10)))) over(), 1, 10 from dual connect by level <= 10
union all
select t1.lv, 
       row_number() over(order by t1.lv), 
       max(decode(rownum, 1, ceil(dbms_random.value(1, t1.total_num - 3)))) over(), 
       t1.times + 1,
       count(1) over()
  from cte t1 
 where t1.times < 3
   and t1.idx not in (t1.rn, t1.rn + 1, t1.rn - 1)
)
select t1.lv from cte t1
 where t1.idx = t1.rn;
nayi_224 2019-08-16
  • 打赏
  • 举报
回复
引用 4 楼 stelf 的回复:
sqlserver的解法,但是你限制了每个随机数的范围了。随机取3个数不应该限制这个 [quote=引用 2 楼 nayi_224 的回复:]
with tab1 as (
select ceil(dbms_random.value(1, 29)) r1
  from dual
)
, tab2 as (
select r1, mod(ceil(dbms_random.value(1, 65 - r1)) + r1 + 1, 100) r2
  from tab1
)
, tab3 as (
select r1, r2, mod(ceil(dbms_random.value(1, 97 - r2)) + r2 + 1, 100) r3
  from tab2
)
select*from tab3
;
[/quote] 满足随机性就是随机数。你自己限定规则又不说是几个意思?
stelf 2019-08-16
  • 打赏
  • 举报
回复
这么解析没毛病,赞一个,谢谢。
引用 1 楼 AHUA1001 的回复:
100以内3个不连续不重复的数字,看前边写的都不包括负数,我这里取0到99的范围。 先确定第二个数字(三个数字中,不是最大的也不是最小的。)的范围,由于不能连续,所以这个数字的取值应该是2到97之间,否则可能连续。 第一个数字(三个数字中,最小的。),取值应该是0到R-2之间,R是第二个数字。) 第三个数字(三个数字中,最大的。),取值应该是R+2到99之间,R是第二个数字。) WITH T1 AS (SELECT FLOOR(DBMS_RANDOM.VALUE (2,98)) R FROM DUAL), T2 AS (SELECT R FROM T1) SELECT FLOOR(DBMS_RANDOM.VALUE (0,R-2)) R FROM T2 UNION ALL SELECT R FROM T2 UNION ALL SELECT FLOOR(DBMS_RANDOM.VALUE (R+2,99)) R FROM T2
AHUA1001 2019-08-16
  • 打赏
  • 举报
回复
100以内3个不连续不重复的数字,看前边写的都不包括负数,我这里取0到99的范围。 先确定第二个数字(三个数字中,不是最大的也不是最小的。)的范围,由于不能连续,所以这个数字的取值应该是2到97之间,否则可能连续。 第一个数字(三个数字中,最小的。),取值应该是0到R-2之间,R是第二个数字。) 第三个数字(三个数字中,最大的。),取值应该是R+2到99之间,R是第二个数字。) WITH T1 AS (SELECT FLOOR(DBMS_RANDOM.VALUE (2,98)) R FROM DUAL), T2 AS (SELECT R FROM T1) SELECT FLOOR(DBMS_RANDOM.VALUE (0,R-2)) R FROM T2 UNION ALL SELECT R FROM T2 UNION ALL SELECT FLOOR(DBMS_RANDOM.VALUE (R+2,99)) R FROM T2
stelf 2019-08-16
  • 打赏
  • 举报
回复
SELECT N + ROW_NUMBER() OVER(ORDER BY N) + 1 FROM (SELECT LEVEL n FROM DUAL CONNECT BY LEVEL <= 96 ORDER BY DBMS_RANDOM.VALUE) WHERE ROWNUM <= 3
超叔csdn 2019-08-15
  • 打赏
  • 举报
回复
with ss as (
select rd_value,rownum rn
from (
select rownum rd_value from dual connect by rownum<=100
order by dbms_random.random
) )
select rd_value,rv1,rv2
from (
select rn,rd_value,lead(rd_value,1)over(order by rn) rv1,lead(rd_value,2)over(order by rn) rv2
from ss )
where abs(rd_value-rv1)>1 and abs(rd_value-rv2)>1 and abs(rv1-rv2)>1
and rownum<=1
stelf 2019-08-15
  • 打赏
  • 举报
回复
sqlserver的解法,但是你限制了每个随机数的范围了。随机取3个数不应该限制这个
引用 2 楼 nayi_224 的回复:
with tab1 as (
select ceil(dbms_random.value(1, 29)) r1
  from dual
)
, tab2 as (
select r1, mod(ceil(dbms_random.value(1, 65 - r1)) + r1 + 1, 100) r2
  from tab1
)
, tab3 as (
select r1, r2, mod(ceil(dbms_random.value(1, 97 - r2)) + r2 + 1, 100) r3
  from tab2
)
select*from tab3
;
stelf 2019-08-15
  • 打赏
  • 举报
回复
这个思路很不错,感谢!
引用 1 楼 超叔csdn 的回复:
with ss as ( select rd_value,rownum rn from ( select rownum rd_value from dual connect by rownum<=100 order by dbms_random.random ) ) select rd_value,rv1,rv2 from ( select rn,rd_value,lead(rd_value,1)over(order by rn) rv1,lead(rd_value,2)over(order by rn) rv2 from ss ) where abs(rd_value-rv1)>1 and abs(rd_value-rv2)>1 and abs(rv1-rv2)>1 and rownum<=1
nayi_224 2019-08-15
  • 打赏
  • 举报
回复
with tab1 as (
select ceil(dbms_random.value(1, 29)) r1
  from dual
)
, tab2 as (
select r1, mod(ceil(dbms_random.value(1, 65 - r1)) + r1 + 1, 100) r2
  from tab1
)
, tab3 as (
select r1, r2, mod(ceil(dbms_random.value(1, 97 - r2)) + r2 + 1, 100) r3
  from tab2
)
select*from tab3
;

17,089

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧