我正在尝试做一些我认为非常简单的事情,只需使用RAND创建一个介于0-1之间的随机数,并将其分配给一个十进制变量。但是每次我在MySQL中运行代码时,它都会归零!
请参见下面的代码:
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();
几个问题。
声明为DECIMAL的列或过程变量将为“数字位数”(即精度)和“小数点右边的数字位数”(即小数位数)分配默认值。
`DECIMAL` is equivalent to `DECIMAL(10,0)` which is no digits to the right of the decimal point.
并且在分配值时,它们将被“截断”或“舍入”为适当的比例,确切的行为取决于操作系统。
作为第二点,MySQL表达式RAND(145)
不会产生伪随机数;每次调用时,它将产生完全相同的数字。作为参数提供的值是“种子”值,它指定伪随机序列的起点。 (该系列不是真正随机的,只是看起来是随机的。
运行此语句时,它将重复返回相同的值:
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()
函数将产生一系列伪随机数。