Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 在给定范围内生成均匀随机偏差_Language Agnostic_Random - Fatal编程技术网

Language agnostic 在给定范围内生成均匀随机偏差

Language agnostic 在给定范围内生成均匀随机偏差,language-agnostic,random,Language Agnostic,Random,我想在给定范围内生成均匀分布的随机整数。我使用的解释语言有一个内置的快速随机数生成器,它返回一个介于0(含0)到1(含1)之间的浮点数。不幸的是,这意味着我不能使用(当RNG返回0(包括)到1(排除)之间的数字)来生成给定范围内的均匀分布随机整数: result=Int((highest - lowest + 1) * RNG() + lowest) 目前我能看到的唯一合理的方法是在罕见的情况下,随机数生成器返回1,只是请求一个新的数字 但如果有人知道更好的方法,我会很高兴听到的 抢劫 注意:

我想在给定范围内生成均匀分布的随机整数。我使用的解释语言有一个内置的快速随机数生成器,它返回一个介于0(含0)到1(含1)之间的浮点数。不幸的是,这意味着我不能使用(当RNG返回0(包括)到1(排除)之间的数字)来生成给定范围内的均匀分布随机整数:

result=Int((highest - lowest + 1) * RNG() + lowest)
目前我能看到的唯一合理的方法是在罕见的情况下,随机数生成器返回1,只是请求一个新的数字

但如果有人知道更好的方法,我会很高兴听到的

抢劫

注意:将现有的随机数生成器转换成这种语言会导致速度非常慢,所以我担心这不是一个可行的解决方案


编辑:链接到实际SO答案。

我不明白为什么需要
+1
。如果随机数生成器在[0,1]间隔内提供值的均匀分布,则

result = lowest + (rng() * (highest - lowest))
应该给你一个不规则分布的值之间的最低

rng()==0,结果=最低+0=最低

最高的

rng()==1,结果=最低+最高-最低=最高

包括+1意味着生成的数字的上限可以高于最高值

rng()==1,结果=最低+最高-最低+1=最高+1

结果值的分布将与随机数的分布相同,因此均匀性取决于随机数生成器的质量


根据下面的评论,您正确地指出Int()将是尾部不平衡分布的来源。最好将Round()用于最接近的整数或脚本语言中的任何等效值。

可能您对速度非常感兴趣,否则每次RNG调用都会占用条件测试。不管怎样,任何其他的选择都可能比分支慢

…除非你确切知道RNG的内部结构。特别是,它的返回值是什么?如果它们不是IEEE-754浮点数或双倍点数,我很同情你。如果是的话,其中有多少真正的随机性呢?浮点数为24,双倍点数为53(尾数位数)。如果这些都是原始生成的,您可以使用移位和掩码从中拼凑出一个普通的旧随机整数生成器,然后在函数中使用它(根据范围的大小,如果您有这样的生成器,您可以使用更多移位和掩码来避免任何分支)。如果您有一个高质量的生成器,可以生成全质量的24位或53位随机数,那么通过一次乘法,您可以将它们从[0,1]转换为[0,1][0,1]:只需乘以小于1的最大可生成浮点数,您的范围问题就消失了。如果尾数没有完全填充随机位,此技巧仍然有效,但您需要做更多的工作才能找到正确的乘数


您可能想看看他们对类似问题的处理。

您还没有解释上述解决方案不起作用的原因。如果随机数生成器是随机数的一个很好的近似值,那么其结果的分布应该是均匀的,计算结果也应该是均匀的。因为RNG的范围是0(包括)对于1(包括1),我们可能最终得到结果=最高+1(即超出所需范围),这是不正确的,例如最低=0和最高=9。当RNG=1时,您只会输出9,但当RNG的输出介于0和0.1之间时,会输出0,但将+1设置为1也不正确,因为当它为1时(这应该以均匀随机概率发生,与0和0.1之间的所有值相同)那么答案不是9,而是10。在我看来,您需要的不是整数值,而是将其四舍五入到最接近的整数。只有当RNG返回从O(包括)到1(排除)的数字时,标准解决方案才是正确的。我将编辑这个问题以使其更清楚。当rng()==1时,您假设的是倾斜尾巴的问题需要a+1和frig。问题不是来自这一点,而是来自整数(),整数向下舍入。如果您舍入到最接近的数字,那么我上面发布的解决方案正好有效。“标准”另一篇文章中的解决方案是错误的。如果您的RNG传递的数字在[0,1]范围内,则标准解决方案是正确的。如果您不相信我,请尝试一下。但是,当RNG传递的数字在[0,1]范围内时,标准解决方案是错误的.目前,我正在为每个调用实现条件。我只是想知道是否有更好的方法。我曾考虑过用不是1的最大可能浮点乘以,但我认为这可能会将不是0的最小可能浮点移动到0,并创建一个非均匀分布。是的,这些技巧可能会影响随机性但是,你无论如何都要把结果转换成一个整数,所以最终的分布不太可能改变。如果你真的需要在2^-53级别上达到完美,你可能无论如何都需要一种不同的语言。