乱数について

[新着] Webテンプレートを仮オープンしました



0   名前: sar : 2006/09/05(火) 06:21  ID:7MitymRP
すいません。どなたか下記のファイルみていただけませんでしょうか?
http://read.kir.jp/file/read55963.htm

26行目意図した動作にならないので、悩んでいます。
乱数で取得した数字と同じ数字は格納しないようにしているのですが、
何度も実行すると同じ数字が出現してしまいます。助けてください
何かよい案はないものでしょうか?

1   名前: sevi- : 2006/09/05(火) 06:21  ID:PQukhZTw
すまないが
意図する動作をもう少し解るように示してくれないと
期待する動作がどのようなものなのか推測出来ず、答えられない.

sevi-

2   名前: 匿名 : 2006/09/05(火) 06:21  ID:7MitymRP
seviさん
レスありがとうございます。

すみません。
問題があるのは下記のファイルでした。
http://read.kir.jp/file/read55999.htm

実は「数独」(http://www.gamedesign.jp/flash/numplace/numplace.html)というパズルの問題を作っていまして、
問題を自動で生成してくれるプログラムを作っています。

28行目を追加したところ、挙動がおかしくなってしまいました。

3   名前: sar : 2006/09/05(火) 06:21  ID:7MitymRP
sarです。自己解決しました。
もしパズルが完成したら、seviさん一度遊んでみて下さい

4   名前: sevi- : 2006/09/05(火) 06:21  ID:PQukhZTw
初めに断っておくが、さすがに問題生成アルゴリズム完成まで付き合うのは
御免こうむる.

配列の中身をランダムで入れ替える関数を構築したのでこれを
使うと良い.
関数、「randomSort」は、与えられた引数(配列を与える)
の中身を適当に入れ替える.

sevi-

			
		//引数の配列の中身をランダムで入れ替える
		function randomSort(list)
		{
			var iCount = list.length;
			var iIndex;
			var obj;
			for(var i=0; i<list.length; i++)
			{
				iIndex = Math.floor(Math.random()*iCount);
				obj = list[iIndex];
				iCount--;
				list[iIndex] = list[iCount];
				list[iCount]= obj;
			}
		}

		//random sort test.
		var list_test = [0,1,2,3,4,5,6,7,8,9];
		randomSort(list_test);
		for(var i=0;i<list_test.length; i++)
			alert(list_test[i]);

5   名前: sar : 2006/09/05(火) 06:21  ID:c95XArZk
seviさん
レスありがとうございます。
有難く参考させて頂きます。

6   名前: 匿名 : 2006/09/05(火) 06:21  ID:c95XArZk
sarです
http://read.kir.jp/file/read56600.htm

seviさん案とは違った形で組んでしまったのですが、
18行目の処理が上手くいきません。
WEBのJavaScriptの解説を参照して書いているのですが

7   名前: sevi- : 2006/09/05(火) 06:21  ID:A5/hQl8Z
すまないが前にも言った通り、このコードを検証する気力が沸かない.
というかそもそも大前提の「長さ9の配列に1〜9迄の重複しない数字を埋める」
という用件が全く満たされていないように見えるのだが.

取りあえずこのコードは捨て
根本から仕様を検証し直した方が良いと無責任だが提案する.

sevi-

8   名前: sar : 2006/09/05(火) 06:21  ID:c95XArZk
自己解決しました。
ご迷惑をおかけ致しました。
すみません

9   名前: sevi- : 2006/09/05(火) 06:21  ID:A5/hQl8Z
取りあえず気を取り直して叩き台を提示する.

重要なのはまず9*9のテーブル全体の整合性より
単一の9マステーブル内の番号が重複しない9つの
番号で構築されている事だと考える.
他のテーブルとの並びの整合性は
個々のテーブルに代入する配列の番号のランダム生成後の
入れ替えで対応させれば良い.

以下に提示するコードは叩き台であり、一つの9ますテーブル
内の整合性しか考慮していない.
後は、createKameList()関数内を拡張し、他のテーブルの
並びに重複が起きないよう内容を並べ替えれば良い.

後は自分で考えるように.

sevi-

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Untitled Page</title>
<script type="text/javascript">
<!--
//亀用の多次元配列を生成し返す
function createKameList()
{
	var list = new Array();
	for(var i=0; i<9; i++)
		list.push(createRandom9NumberList());
	return list;
}
//一つのランダム9番号配列を生成し返す
function createRandom9NumberList()
{
	var list = [1,2,3,4,5,6,7,8,9];
	randomSort(list);
	return list;
}
//引数の配列の中身をランダムで入れ替える
function randomSort(list)
{
	var iCount = list.length;
	var iIndex;
	var obj;
	for(var i=0; i<list.length; i++)
	{
		iIndex = Math.floor(Math.random()*iCount);
		obj = list[iIndex];
		iCount--;
		list[iIndex] = list[iCount];
		list[iCount]= obj;
	}
}
//配列内の数字が記述された9マステーブルを出力する.
function output9CellTable(node_parent, list)
{
	while(node_parent.hasChildNodes())
		node_parent.removeChild(node_parent.lastChild);
	var document = node_parent.ownerDocument;
	var tbl = document.createElement("table");
	var row;
	for(var i=0; i<list.length; i++)
	{
		if(i % 3 == 0)
			row = tbl.appendChild(document.createElement("tr"));
		row.appendChild(document.createElement("td")).appendChild(document.createTextNode(list[i]));
	}
	node_parent.appendChild(tbl);
}
//亀再構築
function initialize_kame()
{
	var list_kame = createKameList();
	var div_kame = document.getElementById("layer_kame");
	output9CellTable(div_kame, createRandom9NumberList());
	var row;
	for(var i=0; i<div_kame.firstChild.childNodes.length; i++)
	{
		row = div_kame.firstChild.childNodes[i];
		for(var j=0; j<row.childNodes.length; j++)
		{
			output9CellTable(row.childNodes[j], list_kame[(i*3)+j]);
		}
	}
	if(document.all)
		div_kame.innerHTML = div_kame.innerHTML;
}
//-->
</script>
<style type="text/css">
td
{
	border-style:solid;
}
</style>
</head>
<body onload="initialize_kame();">
	<div id="layer_kame"></div>
	<a href="#" onclick="javascript:initialize_kame();">再構築</a>
</body>
</html>

10   名前: sevi- : 2006/09/05(火) 06:21  ID:9J5RKOHs
気が変わったので並び替え条件を全て満たす所まで構築してみた.
文字数をオーバーするので全体でなく前回のコードに加えた
修正&追加箇所のみ提出する.

各9テーブル同士の整合性を調整する箇所は面倒なのでアルゴリズムを
単純にし、失敗は最初からやり直すという強引な手を採用した.
2.4Gのペン4PCで試したが、平均0.2〜0.4秒程度で構築できるようだ.
調整をもっとマシなものに変更すれば更に早くなるだろう.
気が向いたらゲーム進行部分のコードを加えて提出する.

sevi-

//亀用の多次元配列を生成し返す
function createKameList()
{
	var list = new Array();
	while(true)
	{
		list.length = 0;
		for(var i=0; i<9; i++)
			list.push(createRandom9NumberList());
		if(!Random9NumberListSort(list[0], null, null, null, list[3]))
			continue;
		if(!Random9NumberListSort(list[0], list[3], null, null, list[6]))
			continue;
		if(!Random9NumberListSort(null, null, list[0], null, list[1]))
			continue;
		if(!Random9NumberListSort(list[1], null, list[3], null, list[4]))
			continue;
		if(!Random9NumberListSort(list[1], list[4], list[6], null, list[7]))
			continue;
		if(!Random9NumberListSort(null, null, list[0], list[1], list[2]))
			continue;
		if(!Random9NumberListSort(list[2], null, list[3], list[4], list[5]))
			continue;
		if(!Random9NumberListSort(list[2], list[5], list[6], list[7], list[8]))
			continue;
		break;
	}
	return list;
}
//隣接する配列と番号が重複しないようlist_sortを並べ替え成否を返す.
function Random9NumberListSort(list1, list2, list3, list4, list_sort)
{
	var list_sorted = new Array();
	var iBeforeCount;var iIndex_check;var iIndex_check2;
	var iRemenberCount = 0;
	while((iBeforeCount = list_sorted.length) < 9)
	{
		iIndex_check = list_sorted.length % 3;
		iIndex_check2 = (list_sorted.length - iIndex_check) / 3;
		for(var i=0; i<list_sort.length; i++)
		{

			if(list1 != null &&
				(list_sort[i] == list1[iIndex_check] ||
				list_sort[i] == list1[iIndex_check + 3] ||
				list_sort[i] == list1[iIndex_check + 6]))
				continue;
			
			if(list2 != null &&
				(list_sort[i] == list2[iIndex_check] ||
				list_sort[i] == list2[iIndex_check + 3] ||
				list_sort[i] == list2[iIndex_check + 6]))
				continue;
			
			if(list3 != null &&
				(list_sort[i] == list3[iIndex_check2*3] ||
				list_sort[i] == list3[iIndex_check2*3+1] ||
				list_sort[i] == list3[iIndex_check2*3+2]))
				continue;
			
			if(list4 != null &&
				(list_sort[i] == list4[iIndex_check2*3] ||
				list_sort[i] == list4[iIndex_check2*3+1] ||
				list_sort[i] == list4[iIndex_check2*3+2]))
				continue;
			
			list_sorted.push(list_sort[i]);
			list_sort.splice(i, 1);
			break;
		}
		if(iBeforeCount == list_sorted.length)
		{
			if(iRemenberCount > 50)
				return false;
			iRemenberCount++;
			list_sorted.length = 0;
			list_sort.length = 0;
			var list_remenber = createRandom9NumberList();
			for(var i=0; i<list_remenber.length; i++)
				list_sort.push(list_remenber[i]);
		}
	}
	for(var i=0; i<list_sorted.length; i++)
		list_sort.push(list_sorted[i]);
	return true;
}

11   名前: sevi- : 2006/09/05(火) 06:21  ID:9J5RKOHs
数独ゲームの制作が完了したので提出する.
コード文字数が1万5千を超えている為適当なアップローダーに発行した.

まだ閲覧しているのなら以下よりダウンロードするように.
尚、パスワードは私の名前だ.

http://iroiro.zapto.org/cmn/jb/jb.cgi?mode=dlkey&id=0047

12   名前: sevi- : 2006/09/05(火) 06:21  ID:9J5RKOHs
数独々、数独々々モード時の構築処理に不具合があったので修正し再提出する.

上記モードは制作中,論理的には時間を掛ければ同じアルゴリズムで3X3X3以上のマスの
数独ルールに基づく表も生成可能である事に気づいた為試しに設けてみたものだ.

因みに当方は,作ってみたはいいが,構築されたそれらの画面を見た瞬間,クリアを諦めた.
あんなものを突破できるのは変人である.

スコア部分は算出処理が適当なのであまり当てにならないが,
暇つぶしにはなると思うので質問者以外の方々も興味があれば挑戦して頂きたい.

IEとFirefoxで動作を確認した.

http://iroiro.zapto.org/cmn/jb/jb.cgi?mode=dlkey&id=0048

13   名前: sar : 2006/09/05(火) 06:21  ID:BTz1u6MQ
seviさん
素晴らしいものを有難うございます。
大切にします。

14   名前: sar : 2006/09/05(火) 06:21  ID:BTz1u6MQ
[スコア]
【ミニ数独モード】
Noamal
score=25
rank=がんばりましょう

【数独モード】
Noamal
score=251
rank=優秀

【数独々モード】
Nomal
(挑戦中!)

一覧へ戻る