在SQLite中仅生成正的随机数

时间:2011-11-29 00:15:39

标签: sqlite random

在SQLite中

  

random()函数返回-9223372036854775808和+9223372036854775807之间的伪随机整数。

您可以使用Select random() % n ;

获得最大值为n的随机数

但这仍然会产生负数。如何在SQLite中只生成正的随机数?

4 个答案:

答案 0 :(得分:21)

使用ABS()(绝对值)功能:

SELECT ABS(RANDOM() % N)

请注意:

  

如果X是整数-9223372036854775808,则abs(X)会抛出整数溢出错误,因为没有等效的正64位二进制补码值。

答案 1 :(得分:5)

要生成仅有上限的正(包括零)随机数,请使用

SELECT ABS(RANDOM() % N)

要生成非零随机数,请使用

SELECT ABS(RANDOM()) % (HIGH - LOW) + LOW

HIGH - 表示上限

- 表示下限。

答案 2 :(得分:3)

用于获取某个范围内的随机数的方法random() % n存在缺陷,因为它会导致分布不均匀。数字零将是任何其他数字的两倍。

顺便说一下,使用ABS使数字为正数是有瑕疵的,使得数字零变为其他任何数字的一半,因此它们相互抵消。

abs(random() % n)

答案 3 :(得分:0)

SELECT ABS(RANDOM() % N)

SELECT ABS(RANDOM()) % N

倾向以提供所需的结果。

在我看来,第二个更具可读性。首先我们伪随机选择一个整数,然后我们应用ABS()确保它是非负的,然后我们用N来模拟这个以选择合适的范围。

但是,第一种方法更可靠。如NullUserException所示,第二种方法具有非常低但非零的抛出整数溢出的风险。