2

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

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)

但是恕我直言,这是无法衡量的草率。

4

4 回答 4

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)的整数。

于 2012-12-18T18:38:44.240 回答
1

请参阅http://www.keithschwarz.com/darts-dice-coins/加载骰子的数据结构?有关几种方法、交易速度和复杂性的信息。

于 2012-12-18T19:04:59.417 回答
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 之间的浮点数,并针对最小/最大值范围进行重载。如果它不可用,你可以很容易地对后一个调用(带有最小值/最大值)进行编码。

于 2012-12-18T18:40:42.120 回答
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;
    }
}
于 2012-12-18T20:00:17.940 回答