如何生成中间带间隔的随机数?校园项目障碍生成需求
实现双区间随机数生成(0-10/30-40)的几种实用方案
嘿,这个需求我熟!做这类校园场景的项目时,要避开中间道路只在两侧offroad区域生成障碍物,本质就是要生成双区间的随机数,我给你几个简单易实现的方案,不管你用什么编程语言都能快速套用:
方法1:分区间选择 + 内部随机取值(最直观)
这个思路逻辑清晰,先随机决定生成左区域(0-10)还是右区域(30-40)的数值,再在选中的区间内生成随机数。
举个Python的实现例子:
import random def get_offroad_position(): # 50%概率选择左/右区域,想调整概率直接改这里的权重就行 choose_left = random.choices([True, False], weights=[0.5, 0.5])[0] if choose_left: # 左区间生成随机数,要整数就用randint(0,10) return random.uniform(0, 10) else: # 右区间生成随机数 return random.uniform(30, 40)
如果是用C#的话:
using System; public static float GetOffroadPosition() { Random random = new Random(); // 随机选左或右区域 if (random.Next(2) == 0) { return (float)random.NextDouble() * 10; } else { return 30 + (float)random.NextDouble() * 10; } }
这个方法的优势是可调试性强,还能灵活调整两侧区域的障碍物生成概率——比如想让左侧障碍物更多,直接把左区域的权重调高就行。
方法2:映射法(简洁高效)
另一种思路是先生成一个单区间的随机数,再通过映射跳过中间的道路区域(10-30)。比如先生成0-20的随机数,把10-20的部分直接加20,就变成了30-40。
Python代码示例:
import random def get_offroad_position(): base_num = random.uniform(0, 20) # 把10-20的区间映射到30-40 return base_num if base_num <=10 else base_num + 20
这个方法只需要一次随机操作,代码更简洁,适合追求性能和代码紧凑的场景。
方法3:排除法(应急可用,不推荐高频场景)
就是直接生成0-40的随机数,如果落在中间道路区域(10-30)就重新生成,直到得到符合要求的数值。
Python代码示例:
import random def get_offroad_position(): while True: pos = random.uniform(0, 40) if pos <=10 or pos >=30: return pos
⚠️ 注意:这个方法虽然简单,但极端情况下可能会多次循环(连续生成中间区域的数),如果你的项目对性能有要求,优先用前两种方法。
额外小提示
- 如果需要生成整数位置,把代码里的
uniform(浮点随机)换成randint(Python)或Next(C#)这类整数随机函数即可。 - 建议把区间参数化,比如把左区间的
[min_left, max_left]和右区间的[min_right, max_right]做成变量,以后调整道路宽度或区域大小的时候,直接改参数不用动逻辑。
内容的提问来源于stack exchange,提问作者Preben Tjemsland
相关产品推荐
相关产品推荐

