最小値と最大値の範囲内で乱数を生成する一般的な方法があります。同じ制限で範囲外の値を生成するための同様の関数もあります。
しかし、重要なのは、入力する必要のあるさまざまなタイプの変数があるということです。一部の変数は符号なしであり、最小-最大範囲はそれらの符号なしタイプと同じです。
これらの変数の範囲外の値を作成しようとすると、変数の制限を超えます(正確には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にキャストして符号なしかどうかを判断しようとしましたが、アプローチが非常に間違っていることがわかりました。
では、取得した変数が符号なしであるかどうかを判断するにはどうすればよいですか、またはすべての符号なし型と比較せずに型が符号なしであるかどうかを確認する方法はありますか?