如何在一个范围内限制一个值?

时间:2018-12-08 05:48:23

标签: algorithm random

目前正在努力找出如何将一个值限制在一个范围内。意思是,给定随机数219,我如何确保将其修改为保持在(2,5)范围内。

这是我当前的实现方式

int min = 2;
int max = 5;
int constrainedValue = (randomValue % max) + min

上面的示例不起作用,因为(219 % 5) + 2 = (4) + 2 = 6显然是6不在我要求的范围内。

此操作的目的是将随机数转换为适合我范围的值。因此,我不能简单地仅通过最大值或最小值进行修改,在某种意义上,该值必须为“随机”。

2 个答案:

答案 0 :(得分:2)

有两种常见的约束值的方法:

  1. 钳位:如果超出此范围,则将其设置为范围的上限,如果位于范围之内,则将其设置为范围的下限。这样可以很容易地写成这样:

    upper_bound = 5;
    lower_bound = 2;
    value = max(lower_bound, min(upper_bound, value))
    
  2. 包装:如果超出上限,我们会将值包装回到下限。这是您尝试使用模运算完成的操作。模的范围是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 =红色):

graph showing the output of the two constraining methods

答案 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。