java - 创建一个随机的,但在一定范围内最频繁

标签 java random numbers

我必须创建一个模拟人的收缩压的特定任务,所以我尝试了这个:

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/

相关文章:

haskell - Haskell 中快速随机生成器的不错选择

python - 检查字符串是否为实数

java - 如何在 Java 中删除重复的列表遍历

java - 无法在父项目中使用外部 jar 文件的 Autowiring 类

mysql - 在 MySQL 中生成一个随机字符串

android - 从图库中查找随机图片

java - Applet 不从 appletviewer 显示

Java 处理程序如何在不发送 onUserInteraction 方法的情况下执行 Intent

javascript - HTML 表单编号类型唯一用户输入

Javascript——使用数字作为整数可靠吗?