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

问题描述 投票:0回答:1

我正在尝试做一些我认为非常简单的事情,只需使用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();
mysql random stored-functions
1个回答
0
投票

几个问题。

声明为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()函数将产生一系列伪随机数。

© www.soinside.com 2019 - 2024. All rights reserved.