某書物から抜粋致しました。
コンパイルと実行はできます。
ですが・・・初心者ゆえにどこでどんなことをしているのか、詳しくわかりません(T_T)
よろしければどんなことが行われているのか教えてください。
よろしくお願いします。
#include <stdio.h>
#include <math.h>
#define N 20
int irnd(int);
void main(void)
{
int i,j,d,a[N+1];
for(i=1;i<=N;i++)
a=i;
for(i=N;i>1;i--){
j=irnd(i-1);
d=a;a=a[j];a[j]=d;
}
for(i=1;i<=N;i++)
printf("%d",a);
}
int irnd(int n)
{
return((rand()/32767.1)*n+1);
}
順列
Re:順列
まずは規約を読んでくださいね。
コードを載せる際にはプレタグを使用してください。
簡単にコメントを入れました。
っという流れです。
結局は配列に0~20の数値が順番に最初に入っているのをシャッフルしたって感じです。
randの上限は十進法で32767なのでrand()/32767.1は必ず1よりも小さいです。
なのでirnd()は20を超える数値を返却することはありません。
19:06
修正しました・・・(赤字)
コードを載せる際にはプレタグを使用してください。
簡単にコメントを入れました。
#include <stdio.h>
#include <stdlib.h>//これがないとコンパイルは通らない
#include <math.h>
#define N 20 //マクロ定義
int irnd(int); //プロトタイプ宣言
void main(void)
{
int i,j,d,a[N+1]; //変数宣言
for(i=1;i<=N;i++) //配列aのi番目に数値iを代入
a=i;
for(i=N;i>1;i--)
{
j=irnd(i-1); //0~20の乱数取得
d=a;a=a[j];a[j]=d; //配列iと配列jの数値交換
}
for(i=1;i<=N;i++) //配列の中身を標準出力に出力
printf("%d\n",a);
}
int irnd(int n) //乱数取得関数
{
return((rand()/32767.1)*n+1);
}
っという流れです。
結局は配列に0~20の数値が順番に最初に入っているのをシャッフルしたって感じです。
randの上限は十進法で32767なのでrand()/32767.1は必ず1よりも小さいです。
なのでirnd()は20を超える数値を返却することはありません。
19:06
修正しました・・・(赤字)