- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
上下文
基于群体的增量学习 (PBIL) 算法的一部分是计算许多有偏差的随机位。每个位的偏差由0.0-1.0范围内相应的double决定。
对于每个位,将 0.0-1.0 范围内的无偏差随机 double 值与偏差进行比较。如果生成的随机 double 值小于偏差,则该位设置为 0,否则为 1。
生成有偏差的位序列后,这些位将转换为各种范围内的 double 值。
问题
我想直接在一个范围内生成一个有偏差的 double 。那是在不操纵 double 表示中的每一位的情况下。每个 double 然后将有一个变量来确定偏差(不是每个位一个)。如前所述,每个 double 也有一个最小和最大常量,用于确定随机 double 的下限和上限。
以下示例生成可接受的分布。然而,如果没有潜在的无限 while 循环就可以很好地解决问题。
public double getBiasedRandom(double bias, double min, double max) {
double rndBiased;
double variance = (max-min)*0.3;
do {
rndBiased = bias + (random.nextGaussian() * variance);
} while(rndBiased < min && rndBiased <= max);
return rndBiased;
}
解决方案不必返回相同的分布,但范围内的所有值都必须是任何偏差的可能结果。此外,更接近偏差的值应该比距离更远的值更有可能。我不知道多少。理想情况下,它将由可以通过实验设置的变量来确定。在上面的例子中,这个变量是常量 0.3。
我尝试研究不同的分布,但我的数学技能不够。另请记住,性能至关重要,近似但有效的解决方案可能是有利的。出于同样的原因,依赖于加权表的解决方案可能不值得。
编辑:添加了受 Cristiano Zambon 的回答启发的潜在解决方案。
最佳答案
如果我理解得很好,您只需要一个函数返回一个随机编号的“以偏差为中心”并且始终在 {min;max} 范围内...
关于:
public double getBiasedRandom(double bias, double min, double max) {
double bias_depth_perc = 0.1;
double bias_depth_abs = (max - min)*bias_depth_perc;
double min_bias = bias - bias_depth;
double max_bias = bias + bias_depth;
Random tRandom = new Random();
if (max_bias > max) max_bias = max;
if (min_bias < min) min_bias = min;
double variance = (max_bias - min_bias)/2;
double rndBiased = bias + tRandom .nextGaussian() * aVariance;
if (rndBiased > max)
rndBiased = max - (rndBiased - max);
if (rndBiased < min)
rndBiased = min + (min - rndBiased);
return rndBiased;
}
实际上,您可以简单地使用以偏差为中心的高斯分布获得有偏差的随机数,您可以将方差设置为范围的百分比(在示例中设置为 10% 行 double bias_depth_perc = 0.1)。
编辑:改变了偏差接近边界时的行为,你会得到很多超出限制的随机数。现在它只是简单地复制边界内随机生成的数字,距离等于与限制本身的距离。这实际上以简单的不对称分布结束。
第二种解决方案:这有点棘手。这里的思路是总是生成一个对称的随机数,然后将生成的数映射到合适的范围内。例如:如果您有:
您首先生成一个以 0.5 为中心的随机数,其方差由您选择:
然后,如果 rnd > 0.5,则将其映射到范围 {bias; bias + max_bias} 具有简单的比例倍增。如果 rnd < 0.5,则将其映射到范围 {min_bias;偏见}。
代码如下:
public double getBiasedRandom(double bias, double min, double max) {
double centered_depth_perc = 0.3;
double centered_depth_abs = (max - min)*centered_depth_perc;
double center = 0.5;
Random tRandom = new Random();
double rndCentered = center + tRandom .nextGaussian() * centered_depth_abs; // generate centered random number.
if (rndCentered >= center)
rndBiased = (rndCentered - center) * (max - bias) + bias;
else
rndBiased = bias - (center - rndCentered) * (bias - min);
// the following two tests will be as more important as centered_depth_perc
// get bigger.
if (rndBiased > max)
rndBiased = max;
if (rndBiased < min)
rndBiased = min;
return rndBiased;
}
希望对您有所帮助。
关于java - 高效的有界偏置随机数生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17936619/
我编写了一个函数来随机从 [-10,10] 中获取一对。 import System.Random main = do { s State g a randomSt = S
好的,我了解如何在 Scala 中实现随机数生成器以及如何设置生成的随机数的上限,但我对如何更改下限感到困惑。例如: var computerGuess= scala.util.Random
我写了一个函数来从 [-10,10] 中随机得到一对。 import System.Random main = do { s State g a randomSt = St
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我正在做一个项目,我需要在其中生成 8 个随机数。由于某种原因,我遇到随机数部分非常耗时的问题。 8 个随机数的意思是我需要一个由数字 0-9 组成的 8 个字符长的字符串。例如 01234567 或
这个问题已经有答案了: Why do I always get the same sequence of random numbers with rand()? (12 个回答) 已关闭 9 年前。
我看到这个问题可能已经在这里得到回答:Random using WELL512 但是,它对用户不太友好,也没有提供如何在“真实世界”的代码片段中使用它的示例。 这是我目前拥有的: #define m
我想知道是否有人可以为我澄清这一行。 Create a function die(x) which rolls a die x times keeping track of how many time
我正在制作一款有 6 名防守球员的足球比赛。我将这段代码设置为随机让他们都向四分卫移动。 我想知道是否有更好的方法来做到这一点。我知道必须有一种方法可以在没有这么多 if 语句的情况下循环它,但我对
在以下位置:http://www.fredosaurus.com/notes-cpp/misc/random.html 它提到如果我们想生成一个1-10范围内的随机数,我们可以这样做: r = (ra
如何在 Linux 和 C++ 中使用随机数? 我找到了一些我想使用的代码,它有一行 srand((unsigned)time(0));//seed 但是 gcc 说 board.cpp:94:24:
这个问题在这里已经有了答案: Generating random whole numbers in JavaScript in a specific range (40 个答案) 关闭 9 年前。
我有以下脚本: Timer=0; function countdown(auctionid){ var auctions; var divs; Timer=Timer+1;
利用oracle的dbms_random包结合rownum来实现,示例如下,随机取499户: select * from ( select * from busi.t_ar_
我需要获取随机数,但它不应该等于之前的数字。这是我的一段代码。但这不起作用。 function getNumber(){ var min = 0; var max = 4; var i;
我对 Haskell 还很陌生。我有一个数据类型: data Sentence= Prop Int | No Sentence | And [Sentence]
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
这个问题已经有答案了: How do I generate random integers within a specific range in Java? (73 个回答) 已关闭 7 年前。
function getRandomArbitrary(min, max) { var r = Math.floor(Math.random() * (max - min + 1) + m
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Generate random number with non-uniform density 我尝试识别/
我是一名优秀的程序员,十分优秀!