我必须创建一个模拟人的收缩压的特定任务,所以我尝试了这个:
rand = new Random();
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
Integer sbp = rand.nextInt((130 - 80) + 1) + 80;
lblSBPCounter.setText(Integer.toString(sbp));
}
}, 1000, 120000);
问题是收缩压的范围是 90 到 120。如果低于 90 或高于 120,那人就有麻烦了。所以在代码中,我尝试每 2 分钟生成一个从 80 到 130 的随机数。问题是随机函数经常低于和高于范围。所以我的问题是:我能否使该函数生成更多从 90 到 120 的数字,并生成更少的 90 以下和 120 以上的数字?好像每 1-2 小时 1 个号码?
最佳答案
您应该使用 Random.nextGaussian() 方法。我选择 105 和 10 作为均值和标准差,因此此示例中只有不到 0.3% 的结果会低于 90 或高于 120。如果数字超出 80 到 130 的范围,我还添加了一 block 以重新生成数字。
rand = new Random();
timer = new Timer();
int mean = 105, standardDeviation = 5;
timer.schedule(new TimerTask() {
@Override
public void run() {
Integer sbp;
do
{
sbp = (int) Math.round((rand.nextGaussian() * standardDeviation) + mean);
}
while(sbp < 80 || sbp > 130)
lblSBPCounter.setText(Integer.toString(sbp));
}
}, 1000, 120000);
如果您(或遇到此问题的人)不知道如何选择标准差,规则是 68.27% 的结果会落在均值的一个标准差内,95.45% 的结果会落在 2 个标准差内SD,99.73%的结果在3个SD以内。
编辑:我忘记包含 Math.round() 并且调换了均值和标准差。
关于java - 创建一个随机的,但在一定范围内最频繁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57730332/