2012年6月17日日曜日

ある整数列からランダムに整数を取り出す。

去年卒業しましたたまのびです。

このブログってOB投稿ありですかね?問題があれば削除してください。

~重複しないように乱数を得る方法~

 整数について乱数を作成すると、数が重複する場合があります。巡回セールスマン問題の巡回経路を決定するときなど、重複する場合問題が発生する場合があります。そんなときにはこれ!!
/*************************************************
関数 :undupRnd(min,max,dest,n)
機能 :最小値min,最大値maxの整数列の中からn個だけ
    無作為に取り出し配列destに格納
戻り値:destの先頭アドレス
備考 :rand()関数を内部で使用
*************************************************/
int *undupRnd(int min,int max,int *dest,int n){
	int i;
	int *array;
	int size = max - min +1;
	if( NULL == dest ){
		fprintf(stderr,"格納先が不正[%s:%s]\n",__FILE__,__LINE__);
		return NULL;
	}
	if( size < n ){
		fprintf(stderr,"取り出す数が取り出す範囲より大きい[%s:%s]\n",__FILE__,__LINE__);
		return NULL;
	}
	if( NULL == (array = (int*)calloc(size,sizeof(int))) ){
		fprintf(stderr,"配列が確保できない[%s:%s]\n",__FILE__,__LINE__);
		return NULL;
	}
	//勢数列の配列を順番に。
	for(i=0;i<size;i++){ array[i] = i+min; }
	
	for(i=0;i<n;i++){
		int index = rand()%(n-i);
		dest[i] = array[index];//抽出
		array[index] = array[n-i-1];//上書き
	}
	free(array);
	
	return dest;
}

簡単にC言語プログラミングしてみました。

実際にコンパイルして使ってみてください。重複しない整数乱数列を生成できます。

このアルゴリズムは至極簡単なものです。

  1. 連続する整数列(取り出す対象)を配列に確保する
  2. 乱数を用いて取り出す要素の添え字を決める
  3. 取り出して格納する。
  4. 取り出した要素を配列の端っこの要素で上書き(これで同じ値は取り出されなくなる)
  5. 次に添字を選ぶときは範囲を1だけ狭める(これで同じ値は取り出されなくなる

4と5によって同じ値が取り出されるのを阻止しています。

関数中での引数nとsize(max-min+1)が等しい(n=size)のとき、この関数は整数を無作為に並び替える機能を持つと言えます。こう考えると用途は広がりそうですね。どんどん使ってみてください。

2012年4月24日火曜日

2012年電算機部始動です。

てすと てすと

引き継ぎ忘れててすいません。

桑原

2011年11月27日日曜日

OpenGLによる3Dシミュレーション

3Dシミュレーションのプログラムってあまり需要ないんですかね?
2Dのものは多く存在するんですけどね。
OpenGLによる3D万有引力シミュレーションプログラムを作成しました。ソースコード載せます(NYSLライセンス)。
ソースコード
プログラム(実行にはglut.dllが必要)
4次のルンゲクッタ法によってシミュレーションを行なっています。
シンプレクティック法を用いてないので、エネルギーが発散してしまいます。
プログラムでは、3つの物体が動いています。 実は、万有引力だけが働く3物体の挙動というのは一般に解析的解けないことが知られています。(特殊な条件下では解析的に解ける)
解析的に解けないことがコンピュータシミュレーションによって、数値的に解けるんです。
少しすごいと思いませんか?
「5年になるとこんなこともできちゃうよ」という報告でした。

2011年6月8日水曜日

遅くなりましたが

6月7日に作成したブラックジャックのソースコードを乗せておきます。
関数化出来る人は、やってみてください。



#include<stdio.h>
#include<stdlib.h>

int main()
{
int pcard=0, ccard=0, ncard;
char yesno;
/*
型 変数名 変数名の意味 変数の意味
int pcard player_card プレイヤーのカードの合計値を保管
int ccard CPU_card CPUのカードの合計値を保管
int ncard now_card 一時的な値の保管用変数
char yesno yesかnoかの入力を保管
*/

/*rand関数を使う為に書く*/
srand((unsigned)time(NULL));

/*プレイヤーの番*/
/*1~13の値をncardに保存*/
ncard = rand()%13+1;
/*ncardが11、12、13の時は、10として扱う*/
if(ncard == 11||ncard==12||ncard==13)ncard=10;
/*pcardにncardを加算*/
pcard += ncard;
while(1){
printf("いまのカードは%dです\n",pcard);
puts("もう一回引きますか? y/n");

do{
scanf("%c",&yesno);
/*エンターキーを入力として受け付けないようにする*/
}while(yesno=='\n');

/*もう引かないときはループを抜ける*/
if(yesno=='n')break;
/*もう一枚引く*/
ncard = rand()%13+1;
if(ncard == 11||ncard==12||ncard==13)ncard=10;
pcard += ncard;
/*21を超えてしまったらループを抜ける*/
if(pcard>21)break;
}

/*NPCの番*/
while(1){
/*16を超えたらもう引かない*/
if(ccard>16)break;
ncard = rand()%13+1;
if(ncard == 11||ncard==12||ncard==13)ncard=10;
ccard += ncard;
}

/*勝敗判定*/
printf("あなたのカード合計%d\n"
"NPCのカード合計%d\n",pcard,ccard);
if(pcard>21 || ((pcard < ccard)&&(ccard<=21)) )puts("負け");
else puts("勝ち");
return 0;
}

2011年4月15日金曜日

たまのびです。
最終学年となった今、僕の頭には多くの情報、知識が詰まっています。
今年度の僕の課題は、僕の持っている情報や知識、ノウハウをできるだけ多く低学年に残すことです。
置き土産とでもいいましょうか。そんなイメージです。

話は変わりますが、先日見慣れない学生が部活に参加していました。
聞いた話によると、その人は電子制御工学科4年生に編入してきた学生だそうです。
C言語に慣れていないのか、ひたすらC言語を教えてもらっていました。
意欲的な学生は応援したくなります。
知識がなくても情熱や意欲のある学生は伸びるはずです。

次は、毎年話題になる新入部員の数の話です。
僕の見た限りでは今年度入部してくれる人は少なそうです。
少し寂しいですね。
一年生に関しては少数精鋭主義で進めます。

2011年4月12日火曜日

ソースコードでも

電算機部村長たまのびさんに怒られてしまいましたので、

去年の夏休みに作った、桜の花びらを舞い散らせるプログラムsakura.exeと、

桜の中を一人の侍がゆくプログラムairily.exeを置いておこうと思います。

あと、それぞれのソースも置いときます。

侍はそこまで大したものではないですが、桜は結構頑張りました。

コンパイルは、BCCを使ってください。
makesamurai.batが、airily.exeの為のバッチファイル、
makesakura.batが、sakura.exeの為のバッチファイルです。

以下のファイルをダウンロードし、カレントディレクトリをこのファイルにしてください。

なんか、ダウンロードしづらいですが、右クリックから新しいウィンドウを表示 にすると落とせるみたいです???

2011年4月10日日曜日

久しく。

電子制御工学科5年のたまのびです。

新年度が始まりました。
去年度は大変な事件と災害がありました。
事件で心を痛めている方、被災された方に謹んでお見舞い申し上げます。

長岡高専が所属する国立高等専門学校機構では、東日本大震災義援金を募集しております。
詳しくは長岡高専のこちらの公式ページを御覧ください。

私も募金しました。他の学生も募金しているようです。
ご協力ください。

ついに私は最終学年を迎えました。
2年前まで電算機部部長を務めていた身としては、部員も増えて嬉しい限りです。
5年生となった今C++言語を学ぶ必要が出てきました。
少し古いサイトですが、現在C++の学習でお世話になっているサイトを紹介します。
C++入門
丁寧に基本的事項が述べられています。プログラミング初心者でも分かりやすいと思います。
参考にしてください。

話は変わりますが、今年度新入生に配るチラシの作成を担当しました。ボツ案も含め載せておきます。
左上の物が採用されたものです。部長が全種類どこかに貼ってくれることを期待しています。





新入生へのチラシを作るのもこれで最後と思うと少し残念です。
今年度は、電算機部と私が精進できる年度であることを祈っています。