緑は赤よりも発生する可能性が高いなど、強度のある確率を生成したいというあなたの質問から理解しています...まあ、この質問はiOSまたはiPhoneの開発とは関係ありません。純粋なプログラミングの質問であり、私は知りませんそれに対する解決策は 1 つだと思います。これが私の解決策であり、通常は単純な解決策を使用したいと思います。
コードを投稿する前に、私の考えを説明したいと思います。この問題は、私たちが高校で習った確率の問題と似ているので、同じように解きます。番号も使用させていただきます。赤のボールが 23 個、緑のボールが 85 個、黄のボールが 10 個、青のボールが 50 個入っている箱があるとします。これらのボールはすべて 1 つのボックスに入っているため、ボックスからランダムに 1 つのボールを選択する必要があるため、赤の確率は 0.23、緑の確率は 0.85 です...
これが私のカラーボールの箱です:
char apples[] = {'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'b', 'b', 'b', 'b', 'b', 'r', 'r', 'y', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'b', 'b', 'b', 'b', 'b', 'r', 'r', 'y', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'b', 'b', 'b', 'b', 'b', 'r', 'r', 'y', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'b', 'b', 'b', 'b', 'b', 'r', 'r', 'y', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'b', 'b', 'b', 'b', 'b', 'r', 'r', 'y', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'b', 'b', 'b', 'b', 'b', 'r', 'r', 'y', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'b', 'b', 'b', 'b', 'b', 'r', 'r', 'y', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'b', 'b', 'b', 'b', 'b', 'r', 'r', 'y', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'b', 'b', 'b', 'b', 'b', 'r', 'r', 'y', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'b', 'b', 'b', 'b', 'b', 'r', 'r', 'y', 'r', 'g', 'g', 'r', 'g', 'g', 'r', 'g'};
特別な分布を使用して、配列内のボールを分散していることに気付きました。数字を使用したボックスの例を想像してみてください。黄色のボールが 10 個あるのに対し、緑色のボールが 85 個あります。これは、黄色のボールが 1 個、緑色のボールが 8 個の隣のボックスに表示されることを意味します。そして、緑が最も可能性が高いので、私はそれを最初に目にすることを期待しています. したがって、私の配列には次のパターンがあることがわかります。
'g', 'g', 'g', 'g', 'g', 'g', 'g', 'g', 'b', 'b', 'b', 'b', 'b', 'r', 'r', 'y',
これは、黄 1 個、緑 8 個、青 5 個、赤 2 個ごとです。他にも赤と緑がいくつかあるので、それらを配列の最後に追加しました。
セットには 168 個のボールが含まれているため、プロセスは非常に簡単です。168 回実行するループを作成し、そのたびに 0 から 167 までの数値を生成します。この数値を配列のインデックスとして使用し、apples
取得したボールを確認します。 .
int counters[4] = {0, 0, 0, 0};
int x;
for(int i=0; i<168; i++)
{
x = arc4random()%168;
if(apples[x] == 'r') counters[0]++;
else if(apples[x] == 'g') counters[1]++;
else if(apples[x] == 'y') counters[2]++;
else if(apples[x] == 'b') counters[3]++;
}
NSLog(@"Red: %i%%", counters[0]);
NSLog(@"Green: %i%%", counters[1]);
NSLog(@"Yellow: %i%%", counters[2]);
NSLog(@"Blue: %i%%", counters[3]);
さまざまな実行でのプログラムの出力例を次に示します。
2013-07-04 19:48:54.557 DOS[798:707] Red: 24%
2013-07-04 19:48:54.560 DOS[798:707] Green: 78%
2013-07-04 19:48:54.562 DOS[798:707] Yellow: 11%
2013-07-04 19:48:54.563 DOS[798:707] Blue: 55%
2013-07-04 19:49:04.899 DOS[811:707] Red: 21%
2013-07-04 19:49:04.901 DOS[811:707] Green: 81%
2013-07-04 19:49:04.905 DOS[811:707] Yellow: 9%
2013-07-04 19:49:04.906 DOS[811:707] Blue: 57%
2013-07-04 19:49:15.243 DOS[824:707] Red: 20%
2013-07-04 19:49:15.246 DOS[824:707] Green: 89%
2013-07-04 19:49:15.246 DOS[824:707] Yellow: 8%
2013-07-04 19:49:15.247 DOS[824:707] Blue: 51%
結果を向上させるために、配列を好きなように操作できます。