C#で乱数を取得する必要がありますが、浮動小数点数として(-15, 15)
の間に値を生成する必要はありません。(-10, 10)
ランダムのように、とが付属している必要が(-15,-10)
あり(10,15)
ます。
取得することは可能ですか?
これは 1 行で実行できますが、わかりやすくするために分けました。
public double GetRandomNumber()
{
//Between 0 and 1
Random random = new Random();
double randomNumber = random.NextDouble();
//Between -0.5 and 0.5;
randomNumber -= 0.5;
//Between -5.0 and 5.0;
randomNumber *= 10.0;
//Between [-15.0, -10.0] or [10.0, 15.0]
randomNumber += Math.Sign(randomNumber) * 10.0;
return randomNumber;
}
1 つの方法は、これを使用することです。
var random = new Random();
var result = random.NextDouble();
if(result < 0.5)
result = -15 + result * 10;
else
result = 5 + result * 10;
Random.NextDouble
0.0 から 1.0 の間の数値を生成します。
0.5 未満の場合、これを負の数を作成する指標として扱います。
結果に小数点以下の桁数が必要であると仮定した別のアプローチ (完全に明確ではないため)。
Random rand = new Random();
var intValue = rand.Next(10,15);
var decimalValue = rand.NextDouble();
var sign = rand.Next(0,1);
if (sign == 0) sign = -1;
return (intValue + decimalValue) * sign;
2つの乱数を生成します。最初の乱数は、-15から-10の範囲にあるか、10から15の範囲にあるかを選択し、2番目の乱数は、その範囲にどれだけ到達したいかを選択します。
試す:
Random random = new Random();
float value = (float) (Math.Sign((random.NextDouble() - 1)) * (10 + 5 * random.NextDouble()));
これを実現するための静的メソッドを次に示します。
public static int RandomRange(int min, int max, bool includeNegatives = false)
{
if( min >= max) throw new Exception("min can't be greater than max");
Random rdm = new Random();
int num = 0;
while (num < min) num = rdm.Next(max + 1);
return num * (rdm.Next() % 2 == 0 ? -1 : 1);
}
それを呼び出すには:
var TenToFifteenNegatives = RandomRange(10, 15, true);
var TenToFifteenNoNegatives = RandomRange(10, 15);
static Random r = new Random(2);
static void Main(string[] args)
{
int d = r.Next(-15, 15);
while ((d >= -15 && d <= -10) || (d >= 10 && d <= 15))
Console.WriteLine(d);
Console.ReadLine();
}
整数が必要で、パフォーマンスを向上させたい場合は、次を使用します。
var rand = new Random();
int value = rand.Next(-5, 7);
return value > 0 ? value + 9 : value - 10;
[-15, -10] と [10, -15] の範囲の数値が必要だと仮定しています。上記のハードコードされた値を適切に調整します。パフォーマンスを向上させるために、ビット演算を実行して比較を回避する方法があるかもしれませんが、それはコメントに残しておきます。