我需要从以下数据中生成一个随机数:
0-10:23%
10-80:50%
80-100:27%
如何根据此类信息生成随机数?
一种方法是适合分布,但我必须为大约一百个变量做这个,我不想适合100个分布。任何提示?
import random
a=[23, 73, 100]
b=[10, 80, 100]
rndval=awesomefunction(a,b)
现在,关于awesomefunction()
,我完全没有线索。
但是,从我所知的一点点来看(以及一个非常草率的实施)
temp_rand=random.uniform(0,100)
if(temp_rand<=23):
rndval=random.uniform(0,10)
if(temp_rand<=73 && temp_rand>23):
rndval=random.uniform(10,80)
if(temp_rand>73):
rndval=random.uniform(80,100)
但是恕我直言,这是草率无法衡量的。
答案 0 :(得分:2)
您可以使用2个随机生成器来实现此目的。第一个应该生成从0到1的随机双精度。
对于此生成器,您应该检查随机数是0到.22,.23到.73还是.74到1.如果数字在第一个范围内,您只需运行另一个随机数生成0到10之间的数字的生成器,这就是你的数字。第二和第三范围也是如此。
一些高级伪代码:
double firstRandomNumber = generateRandomNumberFromZeroToOne();
if (firstRandomNumber <= .22) {
//generate random number from 0 to 10 and that's your number.
} else if (firstRandomNumber <= .73) {
//generate random number from 10 to 80 and that's your number.
} else {
//generate random number from 80 to 100 and that's your number.
}
附注:大多数语言已经有随机数生成器,它们将生成0到1之间的随机数或者一个特定范围(0到10)之间的整数。
答案 1 :(得分:1)
见http://www.keithschwarz.com/darts-dice-coins/和 Data structure for loaded dice?有关几种方法,交易速度和复杂性的信息。
答案 2 :(得分:0)
您可以执行两步随机抓取。第一个随机数会告诉你使用哪个四分位数(大致)。然后从该组中随机抽取。
伪代码:
randPercentile = 100 * Rand()
if (randPercentile <= 23)
randResult = Rand(0, 23)
else if (randPercentile > 23 && randPercentile <= 73)
randResult = Rand(24, 73)
else
randResult = Rand(74, 100)
print randResult
您必须检查Rand API以获取您选择的语言/框架,但大多数Rand函数默认会返回0到1之间的浮点数,并且最小/最大值范围会超载。如果不可用,后者调用(使用min / max)可以很容易地编码。
答案 3 :(得分:0)
C#实现“测距”随机数发生器,可能有N个范围。
using System;
using System.Collections.Generic;
public class MyClass
{
static void Main()
{
var ranges = new List<Range>
{
new Range( 0, 23, 0, 10),
new Range(24, 73, 11, 80),
new Range(74, 100, 81, 100),
};
for (var i = 0; i < 50; i++)
{
var randInt = GetRand(0, 100, ranges);
Console.WriteLine(randInt);
}
Console.ReadKey();
}
static Random _myRandom = new Random();
static int GetRand(int absMin, int absMax, List<Range> ranges)
{
var i = _myRandom.Next(absMin, absMax);
foreach (var range in ranges)
{
if (i >= range.PercentMin && i <= range.PercentMax)
{
return _myRandom.Next(range.ValueMin, range.ValueMax);
}
}
throw new ArgumentOutOfRangeException("Incomplete range?");
}
}
class Range
{
public int PercentMin { get; set; }
public int PercentMax { get; set; }
public int ValueMin { get; set; }
public int ValueMax { get; set; }
public Range(int pctMin, int pctMax, int min, int max)
{
PercentMin = pctMin;
PercentMax = pctMax;
ValueMin = min;
ValueMax = max;
}
}