2

次のデータから乱数を生成する必要があります。

0-10 : 23%

10-80 : 50%

80-100 : 27%

そのような情報から乱数を生成するにはどうすればよいですか?

1 つの方法は、分布を適合させることですが、約 100 の変数に対してこれを行う必要があり、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 までのランダムな double を生成する必要があります。

このジェネレーターでは、乱数が 0 から .22、.23 から .73、または .74 から 1 であるかどうかを確認する必要があります。数値が最初の範囲内にある場合は、別の乱数ジェネレーターを実行して、 0 から 10 までの数字、それがあなたの番号です。同じことが、2 番目と 3 番目の範囲にも当てはまります。

高レベルの疑似コード:

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

N 個の範囲が可能な「レンジング」乱数ジェネレーターの C# 実装。

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 に答える
0

2 段階のランダム フェッチを実行できます。最初の乱数は、どの四分位数を (大まかに) 使用するかを示します。次に、そのグループからランダムに引き出します。

擬似コード:

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 に答える