SQL随机数示例分析
要获取随机数,SQL的编写方式其实有很多种。比如限制数据的范围是7~12,就可以这样写。
mysql> 选择楼层(7 + (RAND() * 6));
+---------------------------- ----------+
|地板(7 + (RAND() * 6)) |
+----------------------------+
| 10 |
+------------- ---------+
集合 1 行
比如限制数据范围在100以内,就可以这样写。
mysql> select truncate(round(rand(),2)*100,0);
+---------------- ------------------+
|截断(round(rand(),2)*100,0) |
+ -------------------------- --------+
| 78 |
+--------------------------------+
当然这只是最基本的实现。 ,没有考虑种子函数的影响。
我们暂且抛开实现的复杂性,结合一些场景来看看不同的实现。我临时编了几个概念,但意思应该是一样的。
平均随机数
这是一种看似随机,但数据分布可控的方式。
例如,如果我生成1到100之间的10个数字,我可以将每10个数字分为1组。每组随机做一个。
这样,我生成了一个从1到10的随机序列。例如,如果第一个随机数是2,我会从20到29中选择一个数字。如果下一个数字是5,那么我将从 50 到 59 中选择一个号码。选择 1 个号码。
这样,数据的分布是可控的,但随机特性得到保证。
一次性随机数
这种随机数就像陕西的炒面,又快又简单,一勺油就可以了。如果我需要 10 个数字,那么我会立即生成 10 个随机数。
实现起来好像有点困难,其实还好,用rand()和limit就可以了。
插入8条数据。
mysql> 插入随机值
(1),(2),(40),(30),(20),(9),(15),(21 );
查询正常,影响8行
记录数:8 重复数:0 警告数:0
默认获取的数据是有序的。
mysql> 从随机中选择*;
+----+
| id |
+----+
| 1 |
| 2 |
| 40 |
| 30 |
| 20 |
| 9 |
| 15 |
| 21 |
+----+
set 8 rows
使用 rand 得到随机序列。
mysql> select *from random order by rand();
+----+
| id |
+ ----+
| 1 |
| 2 |
| 30 |
| 20 |
| 40 |
| 21 |
| 15 |
| 9 |
+----+ p>
set中8行
如果需要拦截,可以使用limit。
mysql> select *from random order by rand() limit 4;
+----+
| id |
+----+
| 30 |
| 21 |
| 9 |
| 20 |
+----+
集合中 4 行
动态随机数
这类随机数成本最高,需要重复计算。反正不确定性别要高得多,但随机性更大。
例如,如果我们从 100 个数字中取出 10 个数字,那么每取出一个数字,我们就需要将其排除并从列表中重新选取。这样的话,如果是连续的数字1 2 3也是可以的。
我们通过SQL简单模拟一下抽奖过程。
初始化表和数据的数量。
create table lucky_money(id int Primary key,money int,statussmallint);
存储过程如下:
分隔符$$
创建过程proc_init()
开始
声明
init_data整数默认1;
当init_data<=1500执行
插入lucky_money值(init_data,0,0);< /p>
set init_data = init_data +1;
end while;
end $$
分隔符;
调用proc_init();
获取到的数据是有序的。那是员工编号。
| 1497 | 1497 0 | 0 |
| 1498 | 1498 0 | 0 |
| 1499 | 1499 0 | 0 |
| 1500 | 1500 0 | 0 |
+------+--------+--------+
集合 1500 行
< p>我们修改状态并随机得到一些数据变化。更新 lucky_money set Money=1000,status=1 order by rand() 限制 200;
更新 lucky_money set Money=3000,status=1 where status=0 order by rand( ) limit 80;
update lucky_money set Money=5000, status=1 where status=0 order by rand() limit 20;
所以第一轮结束后,平均奖金为360元。
mysql> 从 lucky_money 中选择 avg(money);
+------------+
|平均(钱)|
+----------------+
| 360.0000 |
+------------ --+
1 row in set
读完这篇《SQL随机数实例分析》这篇文章就介绍完了。如果你想掌握这篇文章你还是需要自己去使用来理解其中的知识点。如果您想了解更多相关内容文章,请关注行业资讯频道。
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > SQL随机数示例分析