1

Random クラスの拡張を実装しようとしていました。

ただし、この関数には 1 つの機能があり、手順に従って数値を取得できます。例えば:

RandNumb(double min, double max, double step)
RandNumb(1, 10, 2) = 6
RandNumb(100, 1000, 500) = 1000
RandNumb(0.001, 0.1, 0.01) = 0.15

私の最初のアイデアは、最小から最大までの乱数を取得し、これが有効な数値であるかどうかを比較することでした (ステップのため)。そうでない場合は、もう一度別の番号を生成します。

しかし、これは良いパフォーマンスではないことは確かです。どう思いますか?

4

3 に答える 3

5

min / stepからまでの数値を生成し、max / step生成された結果を に掛けるだけstepです。この場合、すべての結果が「有効」になります。

そして、あなたのソリューションの悪い点は、ステップで割った「有効な」数値を取得できない可能性があることです。

于 2012-07-17T23:50:46.393 に答える
2

問題の定義によると、「RandNumb(1、10、2)」の有効な値は次のようになります:1、3、5、7、9。

その場合。コードは次のようになります。

class Program
{
    static void Main(string[] args)
    {
        Random rd = new Random();
        for (int i = 0; i < 10; i++)
        {
            Console.WriteLine("RandNumb(rd, 1, 10, 2)=" + RandNumb(rd, 1, 10, 2));
            Console.WriteLine("RandNumb(rd, 100, 1000, 500)=" + RandNumb(rd, 100, 1000, 500));
            Console.WriteLine("RandNumb(rd, 0.001, 0.1, 0.01) =" + RandNumb(rd, 0.001, 0.1, 0.01)); 
        }
        Console.ReadLine();
    }

    public static double RandNumb(Random rd, double min, double max, double step)
    {
        int range = (int)Math.Floor((max - min) / step);
        int stepCount = rd.Next(0, range + 1);
        return min + (step * stepCount);
    }
}

結果は次のようになります。

RandNumb(rd, 1, 10, 2)=3
RandNumb(rd, 100, 1000, 500)=600
RandNumb(rd, 0.001, 0.1, 0.01) =0,071
RandNumb(rd, 1, 10, 2)=5
RandNumb(rd, 100, 1000, 500)=600
RandNumb(rd, 0.001, 0.1, 0.01) =0,041
RandNumb(rd, 1, 10, 2)=3
RandNumb(rd, 100, 1000, 500)=600
RandNumb(rd, 0.001, 0.1, 0.01) =0,081
RandNumb(rd, 1, 10, 2)=9
RandNumb(rd, 100, 1000, 500)=600
RandNumb(rd, 0.001, 0.1, 0.01) =0,011
RandNumb(rd, 1, 10, 2)=7
RandNumb(rd, 100, 1000, 500)=100
RandNumb(rd, 0.001, 0.1, 0.01) =0,091
RandNumb(rd, 1, 10, 2)=5
RandNumb(rd, 100, 1000, 500)=100
RandNumb(rd, 0.001, 0.1, 0.01) =0,001
RandNumb(rd, 1, 10, 2)=1
RandNumb(rd, 100, 1000, 500)=600
RandNumb(rd, 0.001, 0.1, 0.01) =0,071
RandNumb(rd, 1, 10, 2)=1
RandNumb(rd, 100, 1000, 500)=600
RandNumb(rd, 0.001, 0.1, 0.01) =0,061
RandNumb(rd, 1, 10, 2)=5
RandNumb(rd, 100, 1000, 500)=100
RandNumb(rd, 0.001, 0.1, 0.01) =0,041
RandNumb(rd, 1, 10, 2)=3
RandNumb(rd, 100, 1000, 500)=600
RandNumb(rd, 0.001, 0.1, 0.01) =0,021
于 2012-07-18T00:30:30.903 に答える
1

解決策としてこれはどうですか:

public static class RandomExtensions
{
    public static double RandNumb(
        this Random @this,
        double minimum, double maximum, double step)
    {
        var lowest = System.Math.Ceiling(minimum / step) * step;
        var highest = System.Math.Floor(maximum / step) * step;
        var numbers = (int)(1 + (highest - lowest) / step);
        var index = @this.Next(0, (int)numbers);
        return lowest + index * step;
    }
}

LINQPad でこのコードをテストしたところ、問題なく動作するように見えました。

var rnd = new Random();

rnd.RandNumb(1, 10, 2).Dump();
rnd.RandNumb(100, 1000, 500).Dump();
rnd.RandNumb(0.001, 0.1, 0.01).Dump();
rnd.RandNumb(7, 15, 3).Dump();

これが私の出力のサンプルです:

4
1000
0.08
12
于 2012-07-18T00:44:55.997 に答える