国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > 互联网 > 用MySQL里的Rand()生成 不连续重复 的随机数年龄以及随机姓名字符串

用MySQL里的Rand()生成 不连续重复 的随机数年龄以及随机姓名字符串

来源:程序员人生   发布时间:2014-09-15 15:10:57 阅读次数:3688次

前言:
        RAND函数,返回在范围0到1.0内的随机浮点值。如果一个整数参数N被指定,它被用作种子值。

一,朋友问题描述如下:
(1),有一个用户表,有id,用户的真实名字,年龄。
通过一段存储过程来实现向表里插入100数据,其中年龄随机
姓名 
姓氏:’赵钱孙李周吴郑王’;,随机取出一个
名字:’一段文字字符串’,随机的取出一个字或者两个字
要求:随机的名字不能出现连续重复。

(2),然后我写出的代码如下:
-- 创建用户表,在project里
create table user1 (
id int not null primary key auto_increment,
name varchar(3) not null,
age tinyint not null
) charset utf8;

-- 创建存储过程
delimiter $$
create procedure pro3(num int)
begin
declare fname char(1);
declare name1 char(1);
declare name2 char(1);
declare fullname varchar(3);
declare age int;
declare i int default 1;

while i <=num do
set fname = substring('赵钱孙李周吴郑王',floor(1+8*rand()),1);  -- 姓
set name1 = substring('一二三四五六七八九十甲乙丙丁',floor(1+14*rand()),1); -- 抽一个字
set name2 = substring('一二三四五六七八九十甲乙丙丁',floor(1+14*rand()),1); -- 抽一个字

if round(rand())=0 then  -- 创造一个局部变量fullname代表全名,随机确定是两个字还是三个字
set fullname = concat(fname,name1);
end if;
if round(rand())=1 then
set fullname = concat(fname,name1,name2);
end if;
set age = floor(20+31*rand());  -- 年龄为20-50的随机
insert into user1 values(null,fullname,age);  -- 插入数据
set i = i + 1; 
end while;
end
$$
delimiter ;

(3),执行结果
call pro3(100); -- 执行过程
出现的结果出乎意料,出现了很多连续一样的姓名,执行结果如下:
mysql> select * from user1;
+-----+--------+-----+
| id  | name   | age |
+-----+--------+-----+
|   1 | 赵三       |  28 |
|   2 | 孙一四      |  50 |
|   3 | 郑丁九      |  42 |
|   4 | 王八       |  47 |
|   5 | 钱六      |  48 |
|   6 | 李五       |  26 |
|   7 | 李五       |  41 |
|   8 | 郑二三      |  22 |
|   9 | 孙七六       |  24 |
|  10 | 孙三       |  21 |
|  11 | 钱甲二     |  26 |
|  12 | 孙丙       |  42 |
|  13 | 孙丙       |  37 |
|  14 | 赵六丁       |  24 |
|  15 | 赵六丁       |  40 |
|  16 | 王十七      |  28 |
|  17 | 孙九       |  22 |
|  18 | 李二       |  23 |
|  19 | 李十      |  23 |
|  20 | 赵丁甲      |  50 |
|  21 | 钱一九     |  49 |
|  22 | 钱一九     |  22 |
|  23 | 钱一九     |  30 |
|  24 | 钱一九     |  30 |
|  25 | 孙五       |  46 |
|  26 | 吴三十      |  39 |
|  27 | 赵七二      |  50 |
|  28 | 赵七二      |  29 |
|  29 | 孙甲九      |  20 |
|  30 | 郑乙十     |  35 |
|  31 | 周一      |  50 |
|  32 | 吴甲七       |  50 |
|  33 | 李丁十     |  47 |
|  34 | 李丁十     |  29 |
|  35 | 李丁十     |  40 |
|  36 | 孙五       |  47 |
|  37 | 赵九丙     |  41 |
|  38 | 郑三八      |  43 |
|  39 | 钱七      |  37 |
|  40 | 钱二一     |  24 |
|  41 | 王七五       |  45 |
|  42 | 李十四      |  24 |
|  43 | 李十四      |  28 |
|  44 | 孙甲甲      |  49 |
|  45 | 郑五      |  38 |
|  46 | 赵甲      |  27 |
|  47 | 王三       |  39 |
|  48 | 王三       |  26 |
|  49 | 王三       |  22 |
|  50 | 王三       |  30 |
|  51 | 钱一九     |  44 |
|  52 | 赵四       |  30 |
|  53 | 王十九      |  50 |
|  54 | 王十九      |  34 |
|  55 | 王十九      |  40 |
|  56 | 周丙甲      |  20 |
|  57 | 孙十      |  47 |
|  58 | 王丙       |  32 |
|  59 | 王六       |  43 |
|  60 | 吴三甲       |  29 |
|  61 | 王乙       |  26 |
|  62 | 赵甲      |  46 |
|  63 | 赵甲      |  23 |
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
为码而活
积分:4237
15粉丝
7关注
栏目热点
关闭
程序员人生