http://cri-ch.tv/iwai/52288.html
乱数の使い方が駄目な例が紹介されている。
じゃあ、どうコードを書くのが正しいのかといわれると、なかなか良い方法を思いつかない。
思いついたのは、配列に順番に値を入れて、配列の中身を適当な回数入れ替えるというもの。
#include <stdio.h> #include <stdlib.h> int main() { int box[100]; // 0-99を順番にセット for(int i=0; i<100; i++) { box[i] = i; } for(int i=0; i<100; i++) { // ランダムで2か所選んで入れ替える int pos1 = rand()%100; int pos2 = rand()%100; int temp = box[pos1]; box[pos1] = box[pos2]; box[pos2] = temp; } // 結果表示 for(int i=0; i<100; i++) { printf("%2d ", box[i]); } printf("\n"); }
ただ、どのくらい入れ替えることを繰り返せば、十分にランダムといえるんだろう。とりあえず上の場合は100回繰り返している。
他に考えたのは順番に入れた配列から取り出して、空いた部分を詰めていくというもの。でもこれだと配列の領域が二ついるし、空きを詰めるコストがかかる。
どうも乱数を扱う処理は苦手。