【发布时间】:2011-10-31 01:23:35
【问题描述】:
看起来 RAND 是我需要的,但我在理解它的工作原理时遇到了一些麻烦。
我需要在几千行中插入一个 60 到 120 之间的随机数。表名:listing,列名:hits
你能帮忙吗?
【问题讨论】:
看起来 RAND 是我需要的,但我在理解它的工作原理时遇到了一些麻烦。
我需要在几千行中插入一个 60 到 120 之间的随机数。表名:listing,列名:hits
你能帮忙吗?
【问题讨论】:
要生成一个介于 60 和 120 之间的随机整数,您需要对 RAND() 的结果进行一些算术运算,它只会产生浮点值:
SELECT FLOOR(60 + RAND() * 61);
那么这里发生了什么:
RAND() 将产生类似0.847269199 的值。我们将它乘以 61,得到值 51.83615194。我们添加 60,因为这是您想要的高于零的偏移量 (111.83615194)。 FLOOR() 将整件事向下舍入到最接近的整数。最后,你有 111。
要对几千个现有行执行此操作:
UPDATE table SET randcolumn = FLOOR(60 + RAND() * 61) WHERE (<some condition if necessary>);
更多示例请参见the MySQL docs on RAND()。
注意我认为我有算术权利,但如果您得到的值 59 或 121 超出预期范围,请相应地向上或向下更改 +60。
【讨论】:
这里是如何获得一个范围内的随机数。以下可能有点模棱两可,因为 61 实际上是您的最大值 (120) 减去您的最小值 (60) + 1 以获得包容性结果。
SELECT FLOOR(60 + (RAND() * 61));
SELECT FLOOR(MIN_Value + (RAND() * (MAX_Value - MIN_Value) + 1);
http://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html#function_rand
【讨论】:
UPDATE X SET C = FLOOR(61 * RAND() + 60) WHERE ...;
获取60到120之间的数字(包括60到120);
RAND() 在区间 [0;1) 中创建一个数字(即不包括 1)。所以 61 * RAND() 在 [0, 61) 中产生一个数字。 61 * RAND() + 60 is in [60;121) 通过向下取整,您可以确保您的数字确实在 [60;120] 中。
【讨论】:
当我遇到这种问题时,我尝试了手动,但我有超过 500 行,
从逻辑上讲,我带来了一个对我有帮助的技巧,因为如果您在查询时运行 RAND,
由于重复或主键问题,您最终可能会收到错误报告,特别是如果该列是 PRIMARY KEY 和 AUTO INCREMENT。
更新历史 SET id = FLOOR( 217 + RAND( ) *2161 )
这会自动创建一个随机数,后来我删除了重命名的 IDS 列
来自迈克尔。 谢谢
【讨论】: