0

タイトルが私が達成したいことについてあまり明確ではないことを知っているので、私が達成したいことをより深く説明します。

ほとんどの場合、次のような 2 つの数値の間の浮動小数点数を返すメソッドがあります。

- (float)randomFloatBetween:(float)num1 andLargerFloat:(float)num2 {
    return ((float)arc4random() / ARC4RANDOM_MAX) * (num2-num1) + num1;
}

ここで、パーセンテージのチャンスを追加したいと思います。たとえば、3 から 5 の間のフロートが必要ですが、85% の確率で数値が 3 から 4 の間にありますが、数値が 4 から 5 の間にある可能性は 15% あります。

これは可能ですか?私は他のSOの投稿を見てみましたが、これを達成したいと思っている人はいません。

ありがとう!

4

3 に答える 3

2

スケーリングする場合は、1つの乱数でこれを行うことができます。

r = random();
if (r <= 0.85)
    n = 3 + (r / 0.85);
else
    n = 4 + ((r - 0.85) / 0.15);

これは一般化できます。乱数がn1とn3の間にあり、p1の可能性がn1とn2の間にあり、p2の可能性がn2とn3の間にある場合(n1 <n2 <n3、p1 + p2 = 1)

r = random();
if (r < p1)
    n = n1 + (r / p1)*(n2 - n1)
else
    n = n2 + ((r - p1) / p2)*(n3 - n2)
于 2012-10-21T17:01:59.837 に答える
1

間隔ごとに均一な分布のみが必要な場合は、2 段階で数値を生成できます。最初の段階では間隔を選択し、2 番目の段階では実際の数を取得するために必要な方法を使用します。

たとえば、パーセンテージ範囲を持つ最初の段階のランダムが 0 ~ 84 の場合、3 と 4 でメソッドを呼び出します。4 と 5 の 85 対 99 コールの場合。

于 2012-10-21T16:14:11.973 に答える
1

最初に 0 から 1 の間の乱数を取得します。0 から 0.85 の場合は、目的の範囲で 2 番目の乱数を計算します。0.86-1.0 の場合は、他の目的の範囲で 2 番目の乱数を計算します。

ところで-arc4randomはやり過ぎで、暗号化を目的としています。ランダムを使用するだけです(最初にsrandomでシードします)

于 2012-10-21T16:13:57.740 に答える