MariaDB生成排除指定数值的1-50随机数方法咨询
生成排除指定数值的1-50随机数(MariaDB 11.1.2)
针对你的需求,这里提供两种可靠的实现方法:
方法一:循环过滤法(逻辑简单易维护)
通过生成随机数后检查是否属于排除列表,若不符合则重新生成,直到得到符合要求的数值。可以创建一个自定义函数来复用:
DELIMITER // CREATE FUNCTION get_random_with_exclusions() RETURNS INT BEGIN DECLARE rand_num INT; -- 循环生成直到数值不在排除列表中 REPEAT SET rand_num = FLOOR(RAND() * 50) + 1; UNTIL rand_num NOT IN (5, 11, 21) END REPEAT; RETURN rand_num; END // DELIMITER ;
调用方式:
SELECT get_random_with_exclusions();
如果不想创建函数,也可以用递归查询实现(适合临时使用):
WITH RECURSIVE rand_cte AS ( SELECT FLOOR(RAND() * 50) + 1 AS num UNION ALL SELECT FLOOR(RAND() * 50) + 1 AS num FROM rand_cte WHERE num IN (5, 11, 21) ) SELECT num FROM rand_cte LIMIT 1;
方法二:数值映射法(效率更高)
因为你只排除3个固定数值,总可用数为47个,先生成1-47的随机数,再通过映射规则转换为1-50中排除指定值的结果,避免循环:
SELECT CASE WHEN x < 5 THEN x WHEN x < 11 THEN x + 1 WHEN x < 21 THEN x + 2 ELSE x + 3 END AS random_num FROM (SELECT FLOOR(RAND() * 47) + 1 AS x) AS t;
映射逻辑说明:
- 生成1-47的随机数
x,对应排除后的47个有效数值 - 当
x <5:直接返回x(未触及第一个排除值5) - 当
5<=x <11:返回x+1(跳过排除值5) - 当
11<=x <21:返回x+2(跳过排除值5、11) - 当
x >=21:返回x+3(跳过所有3个排除值)
内容的提问来源于stack exchange,提问作者SPlatten
相关产品推荐
相关产品推荐

