2017-12-03 8 views
-6

私は配列int machine[5] = {1, 2, 3, 4, 5};を持っています。そして、配列を効果的にシャッフルして一意の組み合わせを読むことができる方法を見つけようとしています。 考えられるのは、別の注文がCRAFTプログラムに自分自身を送り込むということです。 ありがとう5要素配列をシャッフルして毎回個別の順序を得るC

+1

いつか私はあなたがお好みの検索エンジン、クラスに十分な注意を払っていない場合は、「日曜日の夜緊急宿題サービス」はビジネスのアイデア... – alk

+0

を約束するかもしれないと感じここに投稿するよりも、始める方が良いです。 –

+0

宿題/クラスではなく、乱数ジェネレータを使用して現在のインデックスを変更していますが、配列を正しくシャッフルして毎回ユニークな組み合わせが得られます –

答えて

-2

これはあなたのニーズに合わせて拡張することができるシンプルなシャッフルプログラムです。

void swap_2_elements(int *m) - 配列内の2つの要素をランダムにスワップします。

void swap_2_elements_n_times(int *m, int ntimes) - 上記の関数を使って2つのランダムに選択された要素をn回スワップします。

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 


void swap_2_elements(int *m) 
{ 
    int i1; // random index 1 
    int i2; // random index 2 
    int v1; // value under undex i1 
    int v2; // value under undex i2 

    while(1) 
    { 
     i1 = rand()%5; 
     i2 = rand()%5; 

     if (i1!=i2) break; 
    } 

    v1 = m[i1]; 
    v2 = m[i2]; 

    m[i1] = v2; 
    m[i2] = v1; 
} 

void swap_2_elements_n_times(int *m, int ntimes) 
{ 
    int i; 

    for(i=0; i < ntimes; i++) 
    swap_2_elements(m); 
} 

// print table 
void print_machine(int *m) 
{ 
    int i; 
    for(i=0; i<5; i++) 
     printf(" i=%i ", m[i]); 

     printf("\n"); 
} 

void remember_last_array(int *m1, int *m2) 
{ 
    int i; 
    for(i=0; i<5; i++) 
     m1[i] = m2[i]; 
} 

int are_arrays_same(int *m1, int *m2) 
{ 
    int i; 

    for(i=0; i<5; i++) 
    { 
     if(m1[i] != m2[i]) 
     return 0; // no 
    } 

    return 1; // yes 
} 

int main() 
{ 
    int i; 
    int machine1[5] = {1, 2, 3, 4, 5}; 
    int machine2[5] = {1, 2, 3, 4, 5}; 

    // Print 10 sets: 
    for(i = 0; i < 10; i++) // each next set is different than the previous one, but it may repeat later! 
    { 
    while(1) 
    { 
     swap_2_elements_n_times(machine2,6); // swap two elements 6 times in the table machine 
     if(are_arrays_same(machine1, machine2) == 1) // compare with the previous set 
      continue; // sets are the same! 

     remember_last_array(machine1,machine2); 
     break; // set is different from previous one 
    } 

    print_machine(machine1); 
    } 

    return 0; 
} 

OUTPUT:

i=1 i=5 i=4 i=3 i=2 
i=2 i=5 i=3 i=4 i=1 
i=4 i=1 i=2 i=5 i=3 
i=5 i=1 i=3 i=4 i=2 
i=3 i=1 i=4 i=5 i=2 
i=4 i=5 i=1 i=2 i=3 
i=5 i=4 i=1 i=3 i=2 
i=4 i=2 i=3 i=5 i=1 
i=3 i=4 i=1 i=2 i=5 
i=3 i=4 i=5 i=1 i=2 
+0

乱数ジェネレータを初期化していないので、実行ごとに同じ順序が得られます。 –

+0

@AnttiHaapalaそれは正しいです。私はしません。 – sg7