4

短いシーケンスでランダムに「感じる」乱数を作成する方法を見つけようとしています。これはクイズゲーム用であり、4つの選択肢があり、ソフトウェアは、他の3つを気を散らすもので埋める前に、正しい答えを入れる4つの場所の1つを選択する必要があります。

明らかに、arc4random % 4長いシーケンスでは十分にランダムな結果が作成されますが、短いシーケンスでは、同じ番号の5つまたは6つが連続して返される可能性があります(頻繁に発生します!)。これは私が避けようとしていることです。

また、「同じ正方形を2回選択しないでください」と単純に言いたくはありません。これは、最初の質問を除くすべての質問に対して3つの可能な回答しか得られないためです。現在、私は次のようなことをしています。

bool acceptable = NO;
do {
  currentAnswer = arc4random() % 4;
  if (currentAnswer == lastAnswer) {
    if (arc4random() % 4 == 0) {
      acceptable = YES;
    }
  } else {
    acceptable = YES;
  }
} while (!acceptable);

私が見落としているこれに対するより良い解決策はありますか?

4

4 に答える 4

3

結果の配列を入力し、それをシャッフルしてから、その順序で割り当てます。

したがって、8つの質問について:

answer_slots = [0,0,1,1,2,2,3,3]

shuffle(answer_slots)

print answer_slots
 [1,3,2,1,0,2,3,0]
于 2010-06-23T06:38:18.900 に答える
3

あなたの質問がcurrentAnswer、例の確率を非反復的に使用して計算する方法であった場合、Guffa が答えを持っています。

問題が、等確率性に違反することなくランダム クラスタリングを回避する方法であり、リストの長さの上限がわかっている場合は、ソート解除に似た次のアルゴリズムを検討してください。

from random import randrange
# randrange(a, b) yields a <= N < b

def decluster():
    for i in range(seq_len):
        j = (i + 1) % seq_len
        if seq[i] == seq[j]:
            i_swap = randrange(i, seq_len) # is best lower bound 0, i, j?
            if seq[j] != seq[i_swap]:
                print 'swap', j, i_swap, (seq[j], seq[i_swap])
                seq[j], seq[i_swap] = seq[i_swap], seq[j]

seq_len = 20
seq = [randrange(1, 5) for _ in range(seq_len)]; print seq
decluster(); print seq
decluster(); print seq

実際に動作する Python コードとの関係は、まったくの偶然です。事前確率が維持されていると確信しており、クラスターを壊しているように見えます(そして時々追加します)。でもかなり眠いので、これはあくまで娯楽用です。

于 2010-06-23T06:57:29.153 に答える
0

繰り返される数の確率を25%減らすために、0から3.75の間の乱数を選び、それを回転させて、0.75が前の答えになるようにします。

浮動小数点値の使用を回避するために、係数に4を掛けることができます。

擬似コード(ここ/で、は整数除算です):

currentAnswer = ((random(0..14) + lastAnswer * 4) % 16) / 4
于 2010-06-23T05:47:52.360 に答える
0

加重配列を設定します。最後の値が 2 だったとしましょう。次のような配列を作成します。

array = [0,0,0,0,1,1,1,1,2,3,3,3,3];

次に、配列内の数値を選択します。

newValue = array[arc4random() % 13];

ここで、配列の代わりに数学を使用するように切り替えます。

newValue = ( ( ( arc4random() % 13 ) / 4 ) + 1 + oldValue ) % 4;

P の可能性と重みの0<W<=1使用の場合:

newValue = ( ( ( arc4random() % (P/W-P(1-W)) ) * W ) + 1 + oldValue ) % P;

P=4 および W=1/4 の場合、(P/WP(1-W)) = 13 です。これは、最後の値が他の値の 1/4 になる可能性があることを示しています。

最新の回答を完全に削除すると、最新の回答が頻繁に表示されるのと同じくらい目立ちます。どのくらいの重さがあなたに合っているかわかりませんが、1/4 が良い出発点です。

于 2010-06-23T06:28:32.243 に答える