カードを重複せずに並べ替えるCプログラム

朝はまだ寒いですね。
カードを毎回順番を変えて重複せずに並べ替えるイメージのCプログラムを作りました。
カードの変わりに氏名などにすると順番を決めるときに使えると思います。
ポイントは最初のfor文です。
100回ループしていますが、回数は1000回でも10000回でもいいと思います。
考え方としては、2つの乱数を発生させて、それに対応した配列の添え字のデータを入れ替えます。

例)
乱数1: r1 = 5
乱数2: r2 = 2
card[5]とcard[2]のデータを入れ替える
この処理を100回ほど繰り返せば適当に入れ替わります

データの入れ替え処理では、単純に変数aと変数bの入れ替えは出来ないため、片方のデータを退避させるためにwork変数を使います。

例)
変数aとbの入れ替え処理
int a = 10, b = 20, work;
work = a;
a = b;
b = work;

いろいろ応用できると思います。(I think it can use in many scenes.)

/*
  xShuffle.c: シャッフル – 重複しないようにカードを並べ替える 
09/05/14(木) mrgarita wrote. – http://mrgarita.net/
*/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(void)
{
  char card[10] = {‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’, ‘I’, ‘J’};
  int i, r1, r2, work;
  
  printf(“\nシャッフルします\n\n”);
  
  /* シャッフルする */
  srand( (unsigned)time( NULL ) );
  for(i=0; i<100; i++){
    r1 = rand() % 10;  /* 乱数1を発生 */
    r2 = rand() % 10;  /* 乱数2を発生 */
    
    work = card[r1];  /* カードを入れ替える */
    card[r1] = card[r2];
    card[r2] = work;
  }
  /* カード表示 */
  for(i=0; i<10; i++){
    printf(“%c\n”, card[i]);
  }
  
  return 0;
}

コメント

タイトルとURLをコピーしました