生成范围内的随机数

Tyl*_*ler 7 random math

我之前已经这样做了,但现在我又在努力解决这个问题,而且我认为我不理解这个问题背后的数学问题.

我想在两边的一个小范围内设置一个随机数1.例子是.98,1.02,.94,1.1,等.所有我找到的例子描述了获得之间的随机数0100,但我怎么可以用它来我想的范围内得到什么?

虽然我使用的是Pure Data,但编程语言在这里并不重要.有人可以解释所涉及的数学吗?

Nic*_*cue 15

制服

如果你想要一个(伪)均匀分布(均匀间隔)在0.9和1.1之间,那么下面的代码将起作用:

  range = 0.2
  return 1-range/2+rand(100)*range/100
Run Code Online (Sandbox Code Playgroud)

相应地调整范围.

伪正常

如果你想要一个正态分布(钟形曲线),你需要特殊的代码,这将是语言/库特定的.您可以使用此代码近似得到:

sd = 0.1
mean = 1
count = 10
sum = 0
for(int i=1; i<count; i++) 
  sum=sum+(rand(100)-50)
}
normal = sum / count
normal = normal*sd + mean
Run Code Online (Sandbox Code Playgroud)


Tro*_*ord 9

一般来说,要获得一个范围内的随机数,你没有得到之间的数字0100,你会得到之间的数字01.然而,这是无关紧要的,因为你可以简单地通过除以#得到0- 1数字100- 所以我不会说明这一点.

在考虑这个伪代码,你需要考虑的一些01你获得的该比例.换句话说,如果我在a和之间有一个任意范围b,那么两个端点之间的百分比是我随机选择的点.(因此,和之间的距离0.52均值52%的随机结果)ab

考虑到这一点,请以这种方式考虑问题:

  1. 设置范围的起点和终点.

    var min = 0.9;

    var max = 1.1;

  2. 获取0和之间的随机数1

    var random = Math.random();

  3. 获取起点和终点范围点之间的差异(b- a)

    var range = max - min;

  4. 将您的随机数乘以差值

    var adjustment = range * random;

  5. 加上最小值.

    var result = min + adjustment;

并且,您可以按顺序理解每个步骤的值:

var min = 0.9;
var max = 1.1;
var random = Math.random();      // random     == 0.52796 (for example)
var range = max - min;           // range      == 0.2
var adjustment = range * random; // adjustment == 0.105592
var result = min + adjustment;   // result     == 1.005592
Run Code Online (Sandbox Code Playgroud)

请注意,结果保证在您的范围内.最小随机值是0,最大随机值是1.在这两种情况下,会发生以下情况:

var min = 0.9;
var max = 1.1;
var random = Math.random();      // random     == 0.0 (minimum)
var range = max - min;           // range      == 0.2
var adjustment = range * random; // adjustment == 0.0
var result = min + adjustment;   // result     == 0.9 (the range minimum)

var min = 0.9;
var max = 1.1;
var random = Math.random();      // random     == 1.0 (maximum)
var range = max - min;           // range      == 0.2
var adjustment = range * random; // adjustment == 0.2
var result = min + adjustment;   // result     == 1.1 (the range maximum)
Run Code Online (Sandbox Code Playgroud)


eri*_*len 6

return 0.9 + rand(100) / 500.0
Run Code Online (Sandbox Code Playgroud)

还是我错过了什么?


Upp*_*age 1

除以 100 并加 1。(我假设您正在寻找 0 到 2 的范围?)