互いに隣接している同一の要素を回避するために、(重複を有する)リストをシャッフル

StackOverflow https://stackoverflow.com/questions/358307

質問

重複は、このような配列[i]を==配列は[I + 1]可能な限り回避される場合という含まれる要素のリストをシャッフルする「最良の」方法がある場合は、

私は疑問に思ってます。

私は、加重広告表示に取り組んでいます(私は、任意の広告主のために回転あたりのディスプレイの数を調整することができます)と2回続けて登場する同じadvertisterを避けたい。

役に立ちましたか?

解決 5

参考までに、私の(非常に)単純なアプローチは、このようなものだった(実際にLINQ / SQLコールを使用するが、これは簡略化されています)

var advertisers = getAdvertisers();
var returnList = new List();
int totalWeight = sumOfAllAdvertisersWeight();
while (totalWeight > 0)
{
    for (int i=0; i<advertisers.Count; i++)
    {
        if (advertisers[i].Weight > 0)
        {
            returnList.add(advertisers[i]);
            advertisers[i].Weight--;
            totalWeight--;
        }
    }
}
return returnList;

これは最後まで重複を回避しますが、ええ、それは後でreturnListを逆方向にチェックするために支払うとテーリング任意の重複がある場合は、試してみて、それ以前のミックスに配置します。

他のヒント

これは<のhref = "https://stackoverflow.com/questions/344860/good-algorithm-for-combining-items-from-n-lists-into-one-with-balanced-distribuとかなり似ています「>この質問を。あなたが広告主とあそこに与えられた例ではA、B、およびCを交換する場合、私はあなたが同じ問題に到着すると思います。たぶんその1のために提案ソリューションのいくつかは、あなたを助けることができます。

基本的なランダム化は、大規模なセットでの十分な分散を起こす必要があります。

あなたが(でもセットによっては必要ではない可能性がある)さらに多くのことを最小限にしたい場合は、

、最も簡単な方法は、間違いなく無作為化後dupes近くを見つけ、周りにそれらを移動することです(ただし、パターンを作成することがあります)。より良いアプローチは、サイドdupesによって側を含む部分集合を作成し、ランダム化をやり直す場合があります。

小さいセットの場合は何もdupesの数に応じて、可能性がないかもしれません。だから、非常に小さなセットのためのソリューションは、(そして、我々は戻って最初の文でね)良い基本的なランダムとなります。

ディルバートのランドン番号ジェネレータ

個人的に私はこれを手にする最も簡単な方法は、配列をランダム化することで、その後、あなたが隣接している同じ値を持つ2つの要素を見つけるまで、それを反復と思います。あなたがお互いの横に同じ値の2を見つけた場合、あなたはそれが同じ値の他の横にはないような場所を見つけるまで、配列を反復することにより、アレイ内の別の場所に後から1を移動させます。あなたが値を見つけることができない場合は、ちょうどそれがどこにあるか、それを残して、配列の次の要素を続けます。これはおそらく最も最適なソリューションではありませんが、小さなデータ・セットの罰金になり、そのプログラムにおそらく最も簡単。

あなたが持つかもしれ重複の最大数は何ですか? 2、3、任意の?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top