在SQLite中
random()
函数返回-9223372036854775808和+9223372036854775807之间的伪随机整数。
您可以使用Select random() % n ;
但这仍然会产生负数。如何在SQLite中只生成正的随机数?
答案 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所示,第二种方法具有非常低但非零的抛出整数溢出的风险。