1

スレッド静的シードを使用して、数値の範囲から乱数を生成するにはどうすればよいですか?

複数の方法から範囲内の乱数を作成する必要があります。問題は同じ古い重複です。

素敵なランダム ジェネレーターがある MSDN ブログを見つけましたが、2 つの値 (通常は 0 ~ 100) の間の範囲が必要です。

http://blogs.msdn.com/b/pfxteam/archive/2009/02/19/9434171.aspx

public static class RandomGenNumber
    {
        private static RNGCryptoServiceProvider _global =
            new RNGCryptoServiceProvider();
        [ThreadStatic]
        private static Random _local;

        //this works
        public static int Next()
        {
            Random inst = _local;
            if (inst == null)
            {
                byte[] buffer = new byte[4];
                _global.GetBytes(buffer);
                _local = inst = new Random(
                    BitConverter.ToInt32(buffer, 0));
            }
            return inst.Next();
        }

        //this is what needs to be fixed
        public static int Next(int low, int high)
        {
            Random inst = _local;
            if (inst == null)
            {
                byte[] buffer = ????;

                _global.GetBytes(buffer);
                _local = inst = new Random(
                    BitConverter.ToInt32(buffer, 0));
            }
            return inst.Next();
        }
    } 

ループするとき、範囲を渡したい

//this is called on a loop and I want to avoid duplicates
     internal ExampleMember PopulateMember()
    {
        var member = new ExampleMember();

        member.gender = RandomGenNumber.Next(0, 100) < 42 ? "M" : "F";

        member.personalityTypeId = RandomGenNumber.Next(1, 45);

        member.age = RandomGenNumber.Next(20, 80);

        ...

ここで何十もの投稿を読みましたが、範囲の例が見つかりませんでした.

数値を生成するバイトの方法は素晴らしくきれいに見えますが、範囲に対して機能させることはできません。Ints または double を渡して乗算する必要がありますか? または、開始範囲と終了範囲を持つ Next のオーバーロードで、そのバッファー値をどのように使用できますか?

4

1 に答える 1

2

inst.Next()する必要がありますinst.Next(low, high)。それで全部です。種まき部分は触る必要はありません。これをヘルパー メソッド (例: static Random GetThreadStaticRandom()) に移動します。

于 2015-04-04T14:38:17.880 に答える