MySql:使用RAND(种子)为变量赋值一个随机数

时间:2014-08-12 04:01:27

标签: mysql random stored-functions

我正在尝试做一些我认为非常简单的事情,只需使用RAND在0-1之间创建一个随机数,并将其分配给十进制变量。 但是每当我在MySQL中运行我的代码时,它都会返回ZERO!

见下面的代码:

DELIMITER $$
CREATE DEFINER=`root`@`localhost` FUNCTION `myfuncRand`() RETURNS decimal(10,5)
    DETERMINISTIC
BEGIN
DECLARE dist decimal;
set dist = RAND(145);
RETURN dist;
END$$


select myfuncRand();

希望有人可以提供帮助。 问候, P

1 个答案:

答案 0 :(得分:0)

有几个问题。

声明为DECIMAL的列或过程变量将具有"数字位数"的默认值。 (即精确度)和"小数点右边的位数" (即比例)分配。

`DECIMAL` is equivalent to `DECIMAL(10,0)` which is no digits to the right of the decimal point.

当分配值时,它们将被"截断"或"四舍五入"在适当的范围内,确切的行为取决于操作系统。

作为第二点,MySQL表达式 RAND(145) 不会产生伪随机数;它每次调用时都会产生完全相同的数字。作为参数提供的值是"种子" value,指定伪随机序列的起始点。 (该系列并非真正随机,它似乎是随机的。

运行此语句时,它将返回重复的相同值:

SELECT RAND(145), RAND(145), RAND(145), RAND(145)

运行此语句时,每次运行时都会生成相同的序列:

SELECT RAND(145), RAND(), RAND(), RAND(), RAND()

所以,要解决两件事。

dist过程变量的声明应指定精度和比例,例如:

DECLARE dist DECIMAL(10,5); 

(这里精度和比例值的选择旨在匹配声明函数返回的数据类型。如果我们只需要小数点后五位数,DECIMAL(6,5)就足够了。)

SET dist = RAND();

重复调用RAND()函数将产生一系列伪随机数。