用MySQL里的Rand()生成 不连续重复 的随机数年龄以(2)

Ubuntu 12.04下源代码安装MySQL5.6以及Python-MySQLdb

MySQL-5.5.38通用二进制安装

--------------------------------------分割线 --------------------------------------

二,分析原因
因为才14个汉字中取一个(数据源太少了),而且连续执行100次,有连续出现重复的随机数是正常的,应该是底层的rand算法没有考虑过滤到连续重复的情况,我们不好去改动底层的mysql源码,但是可以在存储过程中做一个判断,来过滤掉连续重复的情况,思路是如果重复,就重新取一个不重复的。

所以存储过程改动如下:

1.DELIMITER $$

2.USE `test`$$

3.DROP PROCEDURE IF EXISTS `pro3`$$

4.CREATE PROCEDURE `pro3`(num INT)

5.BEGIN

6.DECLARE fname CHAR(1);

7.DECLARE name1 CHAR(1);

8.DECLARE name2 CHAR(1);

9.DECLARE fullname VARCHAR(3);

10.DECLARE pre_fullname VARCHAR(3) DEFAULT \'\';

11.DECLARE age INT;

12.DECLARE i INT DEFAULT 1;

13.WHILE i <=num DO

14.    SET fname = SUBSTRING(\'赵钱孙李周吴郑王\',FLOOR(1+8*RAND()),1);

15.    SET name1 = SUBSTRING(\'一二三四五六七八九十甲乙丙丁\',ROUND(1+14*RAND()),1);

16.    SET name2 = SUBSTRING(\'一二三四五六七八九十甲乙丙丁\',ROUND(1+14*RAND()),1);

17.

18.    IF ROUND(RAND())=0 THEN

19.    SET fullname = CONCAT(fname,name1);

20.    END IF;

21.    IF ROUND(RAND())=1 THEN

22.    SET fullname = CONCAT(fname,name1,name2);

23.    END IF;

24.

25.    SET age = FLOOR(20+31*RAND());

26.    /* 给临时变量赋值,看最新的一条记录的name值 */

27.    SELECT NAME INTO pre_fullname FROM user1 ORDER BY id DESC LIMIT 1;

28.    /* 开始判断,如果刚赋值的name跟上一次赋值的name值一样,就跳过,i保持不变,继续取值;否则i+1,继续循环取值*/

29.    IF fullname=pre_fullname AND i>1 THEN

30.        SET i=i;

31.    ELSEIF fullname IS NULL THEN

32.        SET i=i;       

33.    ELSE

34.        INSERT INTO user1 VALUES(NULL,fullname,age);

35.        SET i = i + 1;

36.    END IF ;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/26ba7f940d245a59a01ebe10501b719c.html