Algorithm 如何将值约束在一个范围内?

Algorithm 如何将值约束在一个范围内?,algorithm,random,Algorithm,Random,目前正在努力找出如何将值限制在某个范围内。也就是说,给定随机数219,我如何确保它被修改为保持在(2,5)的范围内 这是我当前的实现 int min = 2; int max = 5; int constrainedValue = (randomValue % max) + min 上述示例不起作用,因为(219%5)+2=(4)+2=6,显然6不在我要求的范围内 其目的是将随机数转换为适合我的范围的值。因此,我不能简单地用max或min进行mod,值在某种意义上必须是“随机的”。有两种常见的

目前正在努力找出如何将值限制在某个范围内。也就是说,给定随机数219,我如何确保它被修改为保持在(2,5)的范围内

这是我当前的实现

int min = 2;
int max = 5;
int constrainedValue = (randomValue % max) + min
上述示例不起作用,因为
(219%5)+2=(4)+2=6
,显然
6
不在我要求的范围内


其目的是将随机数转换为适合我的范围的值。因此,我不能简单地用max或min进行mod,值在某种意义上必须是“随机的”。

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

  • 夹紧:这里我们将值设置为范围的上限(如果超过),或者设置为范围的下限(如果低于)。这可以很容易地写成:

    upper_bound = 5;
    lower_bound = 2;
    value = max(lower_bound, min(upper_bound, value))
    
  • 换行:如果值超过上限,我们将其换回下限。这就是你试图用模运算来完成的。模的范围为
    上限-下限+1

    value = mod(value, upper_bound - lower_bound + 1) + lower_bound
    

  • 在这里您可以看到这两种方法的行为(1=蓝色,2=红色):


    如果
    随机值
    是一个范围介于-32768和32767之间的整数

    那么下面的内容将完成这项工作

    int constrainedValue = (randomValue - -32,767) * (max - min) / (32,767 - -32,767) + min;
    
    或同等地

    int constrainedValue = (randomValue + 32,767) * (max - min) / (65,535) + min;
    

    如果
    randomValue
    是一个无符号整数,则将-32767改为0,将32767改为65535。

    randomValue的范围(最大值和最小值)是什么?可以是任何值,但就我而言,将始终大于最大值;为什么不直接使用rand()函数并将
    min
    max
    作为参数传递?您的代码是什么编程语言?
    int constrainedValue = (randomValue + 32,767) * (max - min) / (65,535) + min;