Cha*_*ens 7 language-agnostic random
将PRNG的值约束到较小范围的最佳方法是什么?如果使用模数,则旧的最大数字不能被新的最大数字整除,而是偏向0通过(old_max - new_max - 1).我认为最好的方法是这样的(这是浮点数,而不是整数数学)
random_num = PRNG() / max_orginal_range * max_smaller_range
Run Code Online (Sandbox Code Playgroud)
但是我的直觉中有些东西让我质疑那种方法(可能是浮点实现和表示差异?).
随机数生成器将在硬件和软件平台上产生一致的结果,并且约束也需要.
我有理由怀疑上面的伪代码(但不是出于我的想法).MichaelGG的回答让我以不同的方式思考问题.我可以使用较小的数字对其进行建模并测试每个结果.所以,我们假设我们有一个PRNG产生0到31之间的随机数,你希望较小的范围是0到9.如果你使用模数你偏向0,1,2和3.如果你使用伪代码在你偏向0,2,5和7之上.我认为没有一种方法可以将一组映射到另一组.到目前为止,我提出的最好的方法是重新生成大于old_max/new_max,但也存在深层问题的随机数(减少周期,生成新数字的时间,直到一个在正确的范围内,等等).
我想我可能会天真地接近这个问题.可能是时候开始对文献进行一些认真的研究了(有人必须先解决这个问题).
我知道这可能不是一个特别有用的答案,但我认为最好的方法是设想几种不同的方法,然后尝试它们几百万次,并检查结果集。
如有疑问,请亲自尝试一下。
编辑
应该注意的是,许多语言(例如 C#)在其功能中内置了限制
int maximumvalue = 20;
Random rand = new Random();
rand.Next(maximumvalue);
Run Code Online (Sandbox Code Playgroud)
只要有可能,您就应该使用这些代码,而不是您自己编写的任何代码。不要重新发明轮子。