Random 从直方图生成随机数

Random 从直方图生成随机数,random,Random,我需要根据以下数据生成一个随机数: 0-10:23% 10-80:50% 80-100:27% 如何从这些信息中生成随机数 一种方法是拟合一个分布,但我必须对大约100个变量进行拟合,我不想拟合100个分布。有什么提示吗 import random a=[23, 73, 100] b=[10, 80, 100] rndval=awesomefunction(a,b) 现在,关于awesomefunction(),我完全没有任何线索 但是,据我所知很少,(而且实现非常草率) temp_rand=

我需要根据以下数据生成一个随机数:

0-10:23%

10-80:50%

80-100:27%

如何从这些信息中生成随机数

一种方法是拟合一个分布,但我必须对大约100个变量进行拟合,我不想拟合100个分布。有什么提示吗

import random
a=[23, 73, 100]
b=[10, 80, 100]
rndval=awesomefunction(a,b)
现在,关于
awesomefunction()
,我完全没有任何线索

但是,据我所知很少,(而且实现非常草率)

temp_rand=random.uniform(0100)
如果(温度等级73):
rndval=随机均匀(80100)

但依我看,这太草率了

您可以使用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.
}
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
double firstRandomNumber=generateRandomNumberFromZeroToOne();

如果(firstRandomNumber你可以进行两步随机抽取。第一个随机数将告诉你使用哪一个四分位数(大致)。然后从该组中随机抽取

伪代码:

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.
}
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
randPercentile=100*Rand()
如果(随机百分位数23&&随机百分位数见和
有关几种方法、交易速度和复杂性的信息。

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;
    }
}
使用系统;
使用System.Collections.Generic;
公共类MyClass
{
静态void Main()
{
变量范围=新列表
{
新范围(0,23,0,10),
新范围(24,73,11,80),
新范围(74100,81100),
};
对于(变量i=0;i<50;i++)
{
var randInt=GetRand(0,100,范围);
控制台写入线(randInt);
}
Console.ReadKey();
}
静态随机_myRandom=新随机();
静态int-GetRand(int-absMin、int-absMax、列表范围)
{
var i=_myRandom.Next(absMin,absMax);
foreach(范围中的var范围)
{

如果(i>=range.PercentMin&&i什么语言?您至少尝试过哪些代码共享所有内容that@Mr.Alien,我现在是语言不可知论者,但我将分享我认为应该是框架的内容。这可能必须在O(n^2)中运行时间。最有效的方法仍然是相同的想法,但是如果输入在数组中,您可以进行优化。您可以嵌套for循环。这正是我所想的,按照行业标准,这是“草率的”吗?伪代码示例是“草率的”因为它是针对您的范围硬编码的。为了使它更干净和可重用,我可以修改代码以启用不同的范围。有没有办法使“bucket”总数保持不变?例如,如果我有10个bucket而不是3个(0-10、11-20等)我是否需要编写10个if循环?是的,请参阅我之前的评论。最好的方法也会因您选择的语言而异,但您肯定会传递某种范围数据集合,而Rand算法会对其起作用。我已将我的预期代码添加到问题中(我的想法).但如果我有更多的桶,我不认为有办法编写更多的if循环。我可能可以使用switch case,但就是这样?这和问题中的算法是一样的,对吗?