C
1#include <stdio.h> 2#include <time.h> 3#include <stdlib.h> 4 5#define swap(type, x, y) do{ type t = x; x = y; y= t; }while(0) 6 7int main(void){ 8 int num[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 9 int i; 10 11 srand(time(NULL)); 12 for( i = 9; i >= 1; i-- ){ 13 swap( int, num[i], num[ rand() % (i + 1)] ); 14 } 15 16 for( i = 0; i < 10; i++ ){ 17 printf("%d", num[i]); 18 } 19 putchar('\n'); 20 return 0; 21}
例として、FisherYatesのアルゴリズムを用いて配列要素をシャッフルするプログラムを挙げました。
実行例は、
6553000982
のように数値が重なってしまいます。
rnd = rand() % (i + 1);
のように先に乱数を代入しておき、
swap(int, a[i], a[rnd]);
を呼び出すと、(本来はif(i != rnd){/* ... */}の条件を付けていますが、仮に付けなくても)
正しくシャッフルされた形の配列が得られます。
上記プログラムのような引数の渡し方の場合、どのような処理が起こって
別の添字要素に影響を及ぼしているのかいまいち分かりません。
ご教授のほど、よろしくお願い致します。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。