5

最小値と最大値の範囲内で乱数を生成する一般的な方法があります。同じ制限で範囲外の値を生成するための同様の関数もあります。

しかし、重要なのは、入力する必要のあるさまざまなタイプの変数があるということです。一部の変数は符号なしであり、最小-最大範囲はそれらの符号なしタイプと同じです。

これらの変数の範囲外の値を作成しようとすると、変数の制限を超えます(正確にはushort)。

これは私の一般的な方法です:

    private static U GenerateOutOfBounds<U>(U minimum, U maximum) where U : IComparable, IFormattable, IConvertible
    {
        bool b       = g.NextBoolean();
        long signCheckForMinimum = Convert.ToInt64(minimum);
        double maxpp = g.NextDouble(Convert.ToDouble(maximum), Convert.ToDouble(maximum) + g.Next());
        double minpp = g.NextDouble(Convert.ToDouble(maximum), Convert.ToDouble(maximum) + g.Next());
        if (signCheckForMinimum >= 0)
        {
            b = true;
        }

        if (b)
        {
            return (U)Convert.ChangeType(maxpp, Type.GetTypeCode(typeof(U)));
        }
        else
        {
            return (U)Convert.ChangeType(minpp, Type.GetTypeCode(typeof(U)));
        }
    }

番号をlongにキャストして符号なしかどうかを判断しようとしましたが、アプローチが非常に間違っていることがわかりました。

では、取得した変数が符号なしであるかどうかを判断するにはどうすればよいですか、またはすべての符号なし型と比較せずに型が符号なしであるかどうかを確認する方法はありますか?

4

2 に答える 2

13
bool signed = Convert.ToBoolean(typeof(U).GetField("MinValue").GetValue(null));

符号付き型にはゼロ以外の定数があり、ブールキャスト中にMinValue変換されます。true

于 2012-11-28T16:08:06.517 に答える
0

これに答えるには、param == abs(param)を比較して、それが負であるかどうかを判断し、それぞれ処理できるようにします。double(または精度を失わないように可能な最大の符号付き数値タイプ)にアップコンバートすることを試みることができます。

于 2012-11-28T15:05:00.987 に答える