順列

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
初心者

順列

#1

投稿記事 by 初心者 » 16年前

某書物から抜粋致しました。
コンパイルと実行はできます。
ですが・・・初心者ゆえにどこでどんなことをしているのか、詳しくわかりません(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);
}

kazuoni

Re:順列

#2

投稿記事 by kazuoni » 16年前

まずは規約を読んでくださいね。
コードを載せる際にはプレタグを使用してください。

簡単にコメントを入れました。
#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
修正しました・・・(赤字)

box

Re:順列

#3

投稿記事 by box » 16年前

srandか何かで乱数を初期化していないため、
毎回同じ結果を得るという、
あまりおもしろみのないコードですね。>質問者さん or 書籍の著者さん

どうせ乱数を使うなら、実行のたびに結果が変わった方が
少しはおもしろいのではないかと思います。

ところで、タイトルの「順列」とそのコードとは必ずしも合致していません。
順列を求めるというのであれば、例えばNが3なら
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
の6とおりを出力する必要があります。

初心者

Re:順列

#4

投稿記事 by 初心者 » 16年前

kazuoniさん

すみません、タグは以後気をつけます。

また、コメントをつけてくださりありがとうございます。
とても理解しやすかったです(*^-^)

boxさん

確かに、毎回結果が同じなのでつまらないとは思いますが、初心者の私にはちょうど良いぐらいでした。
なるほど、全ての組み合わせを表示する必要があるのですね。
ありがとうございます。


お二人とも、ご丁寧にありがとうございました。
またわからないことがありましたら、ご投稿させていただこうと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る