目前正在努力找出如何将一个值限制在一个范围内。意思是,给定随机数219,我如何确保将其修改为保持在(2,5)范围内。
这是我当前的实现方式
int min = 2;
int max = 5;
int constrainedValue = (randomValue % max) + min
上面的示例不起作用,因为(219 % 5) + 2 = (4) + 2 = 6
显然是6
不在我要求的范围内。
此操作的目的是将随机数转换为适合我范围的值。因此,我不能简单地仅通过最大值或最小值进行修改,在某种意义上,该值必须为“随机”。
答案 0 :(得分:2)
有两种常见的约束值的方法:
钳位:如果超出此范围,则将其设置为范围的上限,如果位于范围之内,则将其设置为范围的下限。这样可以很容易地写成这样:
upper_bound = 5;
lower_bound = 2;
value = max(lower_bound, min(upper_bound, value))
包装:如果超出上限,我们会将值包装回到下限。这是您尝试使用模运算完成的操作。模的范围是upper_bound - lower_bound + 1
:
value = mod(value, upper_bound - lower_bound + 1) + lower_bound
或
value = mod(value - lower_bound, upper_bound - lower_bound) + lower_bound
在这里您可以看到两种方法的行为(1 =蓝色,2 =红色):
答案 1 :(得分:0)
如果randomValue
是整数,则范围在-32,768和32,767之间。
然后执行以下操作
int constrainedValue = (randomValue - -32,767) * (max - min) / (32,767 - -32,767) + min;
或等效地
int constrainedValue = (randomValue + 32,767) * (max - min) / (65,535) + min;
如果randomValue
是无符号整数,则将-32,767更改为0,将32,767更改为65,535。