ソースコードの説明.

ランダムな順列(効率の悪い方法)

1~N の値を1回使ってできるランダムな順列をつくる.

たとえば, 1~6のランダムな順列とは, 3, 2, 5, 1, 6, 4のようなものである. 以下に示すアルゴリズムは, 最悪でN2オーダーお繰り返しを行うもので, 効率の悪い方法である.

  1. 1~N の乱数を一つ得る. これを順列の1番目のデータとする.
  2. 以下をN-1回繰り返す.
  3. 1~N の乱数を一つ得る.
  4. 3で求めた乱数が, いままで作ってきた順列の中に入っていれば3に戻る. irnd(N)は 1~N の乱数を1個得る. irnd(0)の場合は特別で1を返す.

ソースコード

源文件
/*
 *------------------------------------------
 *      ランダムな順列(効率の悪い方法)
 *------------------------------------------
 * Great by liang@Ryukyus
 * Compiler : gcc (GCC) i686-apple-darwin10-gcc-4.2.1 (Max OS X 10.6.6)
 * Date : 23/02/2011
 */

#include <stdio.h>
#include <stdlib.h>
#define N 20

int irnd(int);

int main(void){

  int i,j,flag,a[N+1];

  a[1]=irnd(N);             /* 1 */
  for(i=2; i<=N; i++){      /* 2_start */
    do{
      a[i]=irnd(N);flag=0;  /* 3 */
      for(j=1; j<i; j++){   /* 4_start */
        if(a[i]==a[j]){
          flag=1; break;
        }
      }
    } while (flag==1);      /* 4_end */
  }                         /* 2_end */

  for(i=1; i<=N; i++){
    printf(" %d ",a[i]);
  }
  printf("\n");
  return 0;
}

int irnd(int n){            /* 1~N の乱数*/
  return (int)(rand()/(RAND_MAX+0.1)*n+1);
}

実行結果


 1  3  16  10  11  5  14  19  8  17  2  9  12  15  6  7  13  20  18  4 
Chapter1 @ 目録 @ HomeWork List @ 昭亮's Homepage