繁体   English   中英

在不使用除法/模的情况下将随机整数裁剪为一个值范围

[英]Clip random integer to a range of values without using division/modulo

这样可以做到:

int clamp(int rnd, int min, int max)
{
    return min + rnd % (max - min + 1);
}

不使用除法就可以做到吗? 返回值不一定必须匹配,但是必须保留统一的分布。

rndminmax是任意整数。 在我的情况下, rnd是一个随机整数。

一种可能的解决方案是使用std :: ldexp[0...1)范围转换为double ,然后相乘,但是我想知道是否有一个不涉及浮点和/或除法的简单解决方案。

如果根据注释,您有一个32位int和rnd输入均匀地分布在-2 ^ 31和2 ^ 31之间,则可以将输出计算为min + ((((long long)max-(long long)min) * (unsigned long)rnd))>>32 ,有效地将rnd缩放为0..1,将值缩放为min..max。 自从您撰写本文以来,您并不关心标准,因此我并不特别关注已签名/未签名的转换做法和警告。 只是给出了一个大致的想法-先乘后移而不是除法。

int clamp(uint32_t rnd, int min, int max)
{
    return min + (1ull*rnd*(max - min + 1)) >> 32;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM