algorithm - 生成随机数但排除多个范围而不循环
问题描述
我正在寻找一种数学方法来生成 [a, b) 之间的随机数,在 [c, d)、[e, f)、[g, h) 等处有孔,其中 a < b 和范围是范围内。
我在这里找到了许多示例,说明如果缺少一个范围,如何使算法起作用,但似乎找不到一种可以推广到多个范围的空间/时间有效方法。我的意思是:
一个。所有可能范围的列表并从该列表中选择:不适用于大范围
湾。生成一个随机数并检查它是否是范围之一,否则重试:运行时的无限项
一些突出的测试用例可能是:
generate_random(start=0, end=100, exclude: [(2,50),(51, 100)])
generate_random(start=0, end=1e16, exclude: [(1e6,1e7),(1e3, 1e4)])
以下是我发现的一些示例:
解决方案
所以你想选择a..c-1
, d..e-1
, ...,中的任何一个x..b-1
?
所以N = (c-a) + (e-d) + ... + (b - x)
。r
在 中随机选择0..N-1
。如果r < c
,你就完成了。设置r = r + d
,如果r < e
,你就完成了......
推荐阅读
- excel - 在 Excel for Mac 中打印为 PDF 的 VBA 代码
- sql - 在达到某个值之前统计 SQL 结果中的记录数
- sapui5 - 使用 this.getOwnerComponent().getRouter().navTo() 访问页面时是否会触发事件?
- c# - 如果其他用户在同一个按钮上,则限制用户单击按钮(应用程序位于共享文件夹中,多个用户可以访问)
- python - 由两个时间戳定义的两个时段之间的交集
- postgresql - 无法在自定义类型的列上使用替换功能
- angular - 使用 Angular 7,我如何调用 wikipedia api 并将结果返回到模型中?
- python - 图片在 ax.imshow() 中颠倒,但更改 origin 关键字并不能解决问题
- java - 连接到 HM-10 BLE 模块
- python - Kivy on_touch_move 和 DragBehaviour 不移动 Image Widget