📝计算机生成的都是伪随机数,并不是真正的物理随机数。

生成随机数字

生成 0 到 1 之间的随机数

MySQL 中的 RAND 函数可以用于生成一个大于等于 0 小于 1 的随机数字。例如:

SELECT rand();rand()   |------------------|0.7245639057127423|SELECT rand();rand()    |-------------------|0.01697599982561171|

如果想要重现某些场景,需要确保每次运行时生成相同的随机数。这种情况下可以为 RAND 函数传递一个输入参数,设置一个随机数种子。例如:

SELECT rand(1);rand(1)   |-------------------|0.40540353712197724|SELECT rand(1);rand(1)   |-------------------|0.40540353712197724|

生成指定范围内的随机数

基于 RAND 函数和数学运算,可以返回任意两个数字之间的随机数:

low + RAND() * (high − low)
SELECT 10 + rand(1) * 10;10 + rand(1) * 10 |------------------|14.054035371219772|

如果想要生成某个范围内的随机整数,可以加上 FLOOR 函数。例如:

SELECT floor(10 + rand(1) * (10)) AS rd;rd |----|14.0|

生成 6 位数字手机验证码

我们已经获得了指定范围内的随机整数,加上 LPAD 函数就可以生成由 6 位数字字符组成的手机验证码。例如:

SELECT lpad(floor(rand(999) * 1000000), 6, '0') AS captcha;captcha|-------|088146 |

生成遵循正态分布的随机数

RAND 函数生成的是一个遵循均匀分布的随机数,MySQL 没有提供生成遵循正态分布(normal distribution)的随机数。我们可以创建一个存储函数来模拟正态分布的随机数:

delimiter //create function normal_distrib(mean double, stdev double) returns double no sqlbeginset @x = rand(), @y = rand();set @nd = (sqrt(-2 * log(@x)) * cos(2 * pi() * @y)) * stdev + mean;return @nd;end//delimiter ;

以下语句通过 normal_distrib 函数生成了一个期望值为 0,标准差为 1 的正态分布随机数:

SELECT normal_distrib(0,1);normal_distrib(0,1)|-------------------| 1.4930564399841173|
with recursive temp(val) as ( select normal_distrib(0,1) union all select normal_distrib(0,1) from temp limit 1000000)select /*+ set_var(cte_max_recursion_depth = 1m) */avg(val),std(val)from temp;avg(val)    |std(val)   |---------------------|------------------|-0.002340136192616743|0.9994844557755181|

生成随机字符串

生成固定长度的随机字符串

除了随机数字之外,有时候我们也需要生成一些随机的字符串。MySQL 没有提供专门生成随机字符串的函数,但是可以通过其他函数进行模拟。例如:

SELECT char(floor(rand() * 26)+65) as rand_char;rand_char|---------|T  |
delimiter //create function rand_string(len integer) returns text no sqlbegin declare counter int default 1; declare str text default '';  if len < 1 then return null; end if;  while counter <= len do set str = concat(str, char(floor(rand() * 94) + 33)); set counter = counter + 1; end while;  return str;end//delimiter ;
rand_string(8)|--------------|7j5dz[58  |

另外,MySQL 中的 elt 函数也可以用于返回指定位置中的元素。例如:

SELECT elt(1 + floor(rand() * 36),   0, 1, 2, 3, 4, 5, 6, 7, 8, 9,    'A','B','C','D','E','F','G',   'H','I','J','K','L','M','N',   'O','P','Q','R','S','T',   'U','V','W','X','Y','Z') as val;val|---|B |

生成可变长度的随机字符串

那么,怎么返回一个长度可变的随机字符串呢?很简单,为 rand_string 函数指定一个随机的长度参数即可。例如:

SELECT rand_string(floor(10 + rand() * 11));rand_string(floor(10 + rand() * 11))|------------------------------------|4U13MjO+($}k"cO@5%[     |

生成随机日期和时间

将指定日期增加一个随机的数字,就可以得到随机的日期。例如:

SELECT date_add('2020-01-01', interval rand() * 31 day) rand_date;rand_date |----------|2020-01-19|
SELECT sec_to_time(rand() * 3600) rand_time;rand_time   |------------------|00:05:29.546878000|

获取表中的随机记录

对于返回多行数据的查询语句,RAND 函数每次都会返回不同的随机数据。例如:

SELECT rand(1) FROM employee;rand(1)    |--------------------| 0.40540353712197724| 0.8716141803857071| 0.1418603212962489|...
SELECT emp_id,emp_nameFROM employeeORDER BY rand(1)LIMIT 5;emp_id|emp_name |------|----------|  6|魏延  | 14|张苞  | 16|周仓  | 15|赵统  |  1|刘备  |

如果表中存在自增主键,也可以基于主键生成一个随机数据。例如:

SELECT round(rand() * (SELECT max(emp_id) FROM employee)) AS id;id |----|10.0|
SELECT e.emp_id, e.emp_nameFROM employee eINNER JOIN (SELECT round(rand() * (SELECT max(emp_id) FROM employee)) AS id  ) AS tWHERE e.emp_id >= t.idLIMIT 1;emp_id|emp_name|------|--------|  9|赵云  |

生成 UUID

UUID(Universal Unique Identifier)或者 GUID(Globally Unique Identifier)是一个 128 比特的数字,可以用于唯一标识每个网络对象或资源。由于它的生成机制,一个 UUID 可以保证几乎不会与其他 UUID 重复,因此常常用于生成数据库中的主键值。

MySQL 提供了一个系统函数 UUID,可以用于生成 UUID。例如:

SELECT uuid();uuid()        |------------------------------------|35f67fde-e0e9-11ea-9d25-0800272142b1|
SELECT replace(uuid(),'-','');replace(uuid(),'-','')   |--------------------------------|8505290be0ea11ea9d250800272142b1|
SELECT uuid_short();uuid_short()  |-----------------|98862025337208832|
  • 当前服务器的 server_id 位于 0 到 255 之间,并且在复制结构中具有唯一性;
  • 重启 mysqld 前后没有将服务器主机的系统时间往回调整;
  • 每秒钟的平均调用次数少于 1600 万次。

总结

本文介绍了在 MySQL 数据库中生成随机数据的方法,包括随机数字、验证码、随机字符串以及随机日期和时间等,同时还介绍了如何从表中返回随机记录,以及如何生成 UUID。

更多相关文章

  1. android实践项目一实现简单的验证码和spinner下拉选项效果
  2. android 中使用TextView实现分段显示不同颜色的字符串
  3. exp: 修改Android中strings.xml文件, 动态改变数据
  4. Android(安卓)中数据库查询方法 query() 中的 select
  5. android中SqLite query中用selectionArgs处理字符传值
  6. 修改系统Android版本,版本号
  7. 获取Android系统信息
  8. android 解析xml字符串
  9. Android(安卓)随机生成验证码的bitmap

随机推荐

  1. android项目案例6- 基于Android studio的
  2. android 地图
  3. Android进阶(十八)AndroidAPP开发问题汇
  4. Android动画效果
  5. Android中关联源码
  6. SOAP in Android
  7. android屏幕自适应4方法案例整合
  8. Android studio中的一些小技巧
  9. android怎样将textview置于imageview之上
  10. RatingBar 显示正常版本----断点记录