1

特定の順序付けられた配列の値を 0 から n まで混合する関数を作成しようとしています。だからこれは私の試みです:

void JumbleUp(int *sorted,int n){
int jumble[n];
bool mark[n];
for(int i=0;i<n;i++)
    mark[i]=false;
int aux=0;
srand(time(NULL));
for(int i=0;i<n;i++){

    do {
        aux=(rand()%n);
        }while (mark[aux]);

    jumble[i]=sorted[aux];
    mark[aux]=true;
    }

問題は、この関数は時間がかかるため、大きな整数に対しては機能しないことです。では、機能を改善するために何ができるか、または配列をごちゃ混ぜにするために使用できる他の代替手段は何ですか。

4

1 に答える 1

3

あなたはそれを考えすぎています。まず、srandプログラムの開始時に一度だけ呼び出します。次に、アルゴリズムについては、疑似コードのようなもの

for index in 0..n-1
    index2 = random (0..n-1)
    swap (ar, index, index2)

ここで間違っている可能性がありますが、たとえば ではなく、index2範囲を超えることが重要だと思います。そのため、すべてのピースがすべての場所に到達する可能性が等しくなります。コメントで提案されている代替案は次のとおりです。これは、均等に分散されたシャッフルも生成する可能性があります。0..n-1index..n-1

for index in 0..n-2
    index2 = random (index..n-1)
    swap (ar, index, index2)
于 2013-02-19T04:49:06.670 に答える