如何生成分布均匀、每日奇偶总数相等的随机奇偶数
实现方案
逐小时临时生成1-2随机数的做法本质是独立概率事件,根本没法保证单日24次执行完后奇偶数刚好各占一半,要同时满足「无固定规律、随机分布」和「每日奇偶总数完全相等」的硬约束,必须换成预生成当日序列的逻辑,别每次跑任务的时候现算随机数。
具体步骤
- 每天零点做当日序列初始化:先凑出包含12个
odd、12个even的基础列表,从总数上直接卡死奇偶各半的要求 - 用Fisher-Yates洗牌算法把这个列表彻底打乱,这种算法洗出来的序列是完全无规律的,不会出现固定交替、前后块分布不均的问题
- 把洗好的序列存到本地就行,不管是定时任务的上下文变量、本地小文件还是轻量缓存都可以,和当天日期绑定
- 当天每到整点跑任务的时候,直接拿当前小时的0-23序号当索引,从预存的当日序列里取对应的奇偶值走业务分支就行,不用再做额外的随机计算
- 当天23点的任务跑完之后,直接清掉当日的序列,等零点再生成下一天的新序列就行
效果示例
洗出来的序列和你给的参考风格一致,没有固定规律,且最终奇偶总数严格相等:
Hour, Random number(between 1 and 2) 0, odd 1, even 2, even 3, even 4, odd 5, even 6, odd 7, odd 8, even 9, odd 10, even 11, odd 12, odd 13, even 14, odd 15, even 16, even 17, odd 18, even 19, even 20, even 21, odd 22, odd 23, odd
注意事项
- 别用“先实时生成随机数,最后几小时凑数补平衡”的歪招:这种写法很容易在当天最后几个小时出现固定补奇/补偶的规律,一眼就能看出人为调整的痕迹,完全破坏随机效果
- 别自己写随便交换位置的假洗牌逻辑:很容易出现序列分布倾斜,比如前半天全是奇数后半天全是偶数,极端情况甚至会到最后几个值没得选,直接暴露规律
内容的提问来源于stack exchange,提问作者Thangarajan Pannerselvam
相关产品推荐
相关产品推荐

