我使用以下函数在特定范围内生成随机双精度:

nextDouble(1.50, 7.00)

然而,我一直在try 提出一种算法,使随机化具有更高的概率来生成接近1.50而不是7.00的双精度.但我甚至不知道它从哪里开始.有什么事吗?

Java也很受欢迎.

推荐答案

我建议不要从生成概率不规则的随机数的Angular 来考虑这个问题.相反,考虑通常在某个范围内生成一个随机数,然后以非线性方式将该范围映射到另一个范围.

让我们将算法分为3个步骤:

  1. 线性生成[0, 1)范围内的随机数(因此使用标准随机生成器).
  2. 以非线性方式将其映射到另一个[0, 1)范围.
  3. 将结果[0, 1)线性映射为[1.5, 7).

步骤1.和3.都很简单,我们算法的核心是2.我们需要一种将[0, 1)映射到另一个[0, 1)的方法,但这是非线性的,因此,例如0.7不必生成0.7.classic 数学在这里很有帮助,我们只需要看看代数函数的可视化表示.

在您的例子中,您希望当输入数从0增加到1时,结果首先增长非常缓慢(在更长的时间内保持在1.5附近),但随后会加快.例如,y = x ^ 2函数就是这样的.生成的代码可能类似于:

fun generateDouble(): Double {
    val step1 = Random.nextDouble()
    val step2 = step1.pow(2.0)
    val step3 = step2 * 5.5 + 1.5
    return step3
}

or just:

fun generateDouble() = Random.nextDouble().pow(2.0) * 5.5 + 1.5

通过将指数更改为更大的数字,曲线将更具侵略性,因此它将更倾向于1.5.通过使指数接近1(例如1.4),结果将更接近线性,但仍然有利于1.5.使指数小于1将开始有利于7.

您还可以查看具有此形状的其他代数函数,例如y = 2 ^ x - 1.

Java相关问答推荐

Java同步小服务器

如何用Java表示C++类以通过FFI使用?

使用hibiter中特定字段的where条款自定义映射

如何让HikariCP指标在NewRelic中正确显示?

在Spring Boot中测试时出现SQL语法错误

Annotation @ Memphier无法正常工作,并表示:class需要一个bean,但找到了2个bean:

Java 8中的多个字段和计数

neo4j java驱动程序是否会在错误发生时自动回滚事务?

如何创建同一类的另一个对象,该对象位于变量中?

在Java中,在单个逻辑行中连接列表和单个元素的正确方法是什么?

Java中的死锁及其重入锁和锁

Spring data JPA/Hibernate根据id获取一个列值

在Spring终结点中,是否可以同时以大写和小写形式指定枚举常量?

Spring Security不允许加载js

在Oracle JDBC连接中,连接失效和身份验证失效是什么意思?

Java 11 HttpCookie.parse在解析包含JSON的Cookie时引发IlLegalArgumentException

如何在Java中使用正则表达式拆分字符串

如何对存储为字符串的大数字数组进行排序?

使用同步方法中的新线程调用同步方法

使用原子整数的共享计数器并发增量