<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>いちばんやさしいゲームの作り方 &#187; 乱数</title>
	<atom:link href="http://www.game-create.com/archives/tag/%e4%b9%b1%e6%95%b0/feed" rel="self" type="application/rss+xml" />
	<link>http://www.game-create.com</link>
	<description>文系の人でも、数理学がわからない人でもゲームプログラミングをマスターできるブログ</description>
	<lastBuildDate>Tue, 08 Jun 2010 01:28:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>音楽の楽が楽しいという字なら、なぜ数学の学は楽しいではなかったのか？</title>
		<link>http://www.game-create.com/archives/1832</link>
		<comments>http://www.game-create.com/archives/1832#comments</comments>
		<pubDate>Thu, 18 Jun 2009 09:23:44 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームミュージック]]></category>
		<category><![CDATA[メルセンヌツイスタ]]></category>
		<category><![CDATA[乱数]]></category>
		<category><![CDATA[作曲]]></category>
		<category><![CDATA[初心者]]></category>
		<category><![CDATA[勉強]]></category>
		<category><![CDATA[数学]]></category>
		<category><![CDATA[音楽]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=1832</guid>
		<description><![CDATA[ありがちな意見。

いえ、音楽の勉強をしていると、数学にゆかりのある方の名前がたくさん出てきて面白いんです。先日もメルセンヌの名前が出てきて驚きました。ゲームプログラミング周りだと乱数生成アルゴリズムのメルセンヌツイスタ [...]]]></description>
			<content:encoded><![CDATA[<p>ありがちな意見。</p>
<p><span id="more-1832"></span></p>
<p>いえ、音楽の勉強をしていると、数学にゆかりのある方の名前がたくさん出てきて面白いんです。先日もメルセンヌの名前が出てきて驚きました。ゲームプログラミング周りだと乱数生成アルゴリズムのメルセンヌツイスタにその名前があります（メルセンヌツイスタを考えたのは別の人ですが）。音波が波形で、数学の守備範囲ということなんでしょうか。</p>
<p>音楽面白いなぁ。早く作曲したい。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/1832/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ついにスパロボがリセットプレイに対策してきました</title>
		<link>http://www.game-create.com/archives/920</link>
		<comments>http://www.game-create.com/archives/920#comments</comments>
		<pubDate>Mon, 03 Nov 2008 12:06:31 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲーム]]></category>
		<category><![CDATA[PSP]]></category>
		<category><![CDATA[スパロボ]]></category>
		<category><![CDATA[乱数]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=920</guid>
		<description><![CDATA[通勤などの移動時間を利用してスパロボをプレイしているのですが、いつの間にかリセットプレイができなくなっていました。

どういうからくりなのかというと、セーブデータに乱数列を記憶しておいて、リセットしても乱数列に再現性を持 [...]]]></description>
			<content:encoded><![CDATA[<p>通勤などの移動時間を利用してスパロボをプレイしているのですが、いつの間にかリセットプレイができなくなっていました。</p>
<p><span id="more-920"></span></p>
<p>どういうからくりなのかというと、セーブデータに乱数列を記憶しておいて、リセットしても乱数列に再現性を持たせているのです。つまり、セーブ→攻撃を受ける→リセット→攻撃を受ける→避けるまでリセット…という繰り返しができなくなっているのです。何回リセットしても乱数列が変わらないので永遠に避けられません。</p>
<p>さらに攻撃を回避するたびに回避率が低下するようになり、ガンダムなどの機動性の高い機体で敵陣の HP を削って倒すという楽なプレイもできなくなっています（もっとも、こちらはプレイヤーにも有利な部分があるので問題になりませんが）。</p>
<p>プロデューサー曰く「不条理をなくす」という理念らしいのですが、一貫してきた仕様が変わるというのは衝撃が大きいです。おかげさまでシリーズものなのに新作をプレイしているかのような気分になりました。</p>
<p>自分が作るゲームでもルールは時間をかけて検証しようと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/920/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>乱数の種にこんな値はどうでしょうか？</title>
		<link>http://www.game-create.com/archives/893</link>
		<comments>http://www.game-create.com/archives/893#comments</comments>
		<pubDate>Sun, 26 Oct 2008 12:47:17 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[スレッド]]></category>
		<category><![CDATA[プロセス]]></category>
		<category><![CDATA[乱数]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=893</guid>
		<description><![CDATA[srand() 系の関数に渡す際に良さそうな値がありました。

実行しているプログラムのプロセス ID とスレッド ID を取得する関数です。プロセス ID はポインタを渡して値を詰めてもらいます。
DWORD proc [...]]]></description>
			<content:encoded><![CDATA[<p>srand() 系の関数に渡す際に良さそうな値がありました。</p>
<p><span id="more-893"></span></p>
<p>実行しているプログラムのプロセス ID とスレッド ID を取得する関数です。プロセス ID はポインタを渡して値を詰めてもらいます。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-identifier">DWORD processID</span><span class="hl-default"> = </span><span class="hl-number">0</span><span class="hl-default">;
</span><span class="hl-identifier">DWORD threadID</span><span class="hl-default"> = </span><span class="hl-identifier">GetWindowThreadProcessId</span><span class="hl-brackets">(</span><span class="hl-identifier">hWindow</span><span class="hl-code">, &amp;</span><span class="hl-identifier">processID</span><span class="hl-brackets">)</span><span class="hl-default">;</span></pre></div></div>
<p>時間だけだとサーバサイドのゲームでは危険が伴いますが、プロセス ID とスレッド ID を使って加工すれば結構良い感じの値が作れるのではないでしょうか。もし UNIX 系の OS の場合は /dev/random の値も良さそうです。</p>
<p>本当は Windows でも ThinkPad のようなマシンには TPM による精度の良い乱数生成ユニットがあるのですが、プログラムから参照する方法がわかりません。一般的な技術になってほしいですよね。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/893/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>rand() 関数を使ってそれなりに使える乱数を取得する際のガイドライン</title>
		<link>http://www.game-create.com/archives/844</link>
		<comments>http://www.game-create.com/archives/844#comments</comments>
		<pubDate>Mon, 13 Oct 2008 10:53:51 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[まとめ]]></category>
		<category><![CDATA[乱数]]></category>
		<category><![CDATA[備忘録]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=844</guid>
		<description><![CDATA[rand() 関数を使う場合の注意点をまとめてみました。

種を毎回初期化しない
srand() によって乱数の基を設定することができますが、実行はゲームが開始した直後など一度にとどめておきます。 srand() 関数で [...]]]></description>
			<content:encoded><![CDATA[<p>rand() 関数を使う場合の注意点をまとめてみました。</p>
<p><span id="more-844"></span></p>
<h4>種を毎回初期化しない</h4>
<p>srand() によって乱数の基を設定することができますが、実行はゲームが開始した直後など一度にとどめておきます。 srand() 関数で設定した乱数列は再現性がありますので毎回同じ値で初期化はしません。</p>
<h4>種の初期化に時間を使わない</h4>
<p>種に時間を使うと同一の乱数列ができる可能性があります。オンラインゲームのサーバサイドプログラムを作る際にはアプリケーションサーバの初期化時や、プロセスの終了時に次回の乱数列を作るなどします。</p>
<h4>rand() 関数が返した値の下位ビットを使わない</h4>
<p>rand() 関数が返す値の下位ビットは乱雑性能が良くないため上位ビットを使います。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/844/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>０からｎまでの乱数を取得する</title>
		<link>http://www.game-create.com/archives/489</link>
		<comments>http://www.game-create.com/archives/489#comments</comments>
		<pubDate>Wed, 23 Jul 2008 13:16:21 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[メルセンヌツイスタ]]></category>
		<category><![CDATA[乱数]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=489</guid>
		<description><![CDATA[０からｎまでの乱数を取得するためには srand() 関数と rand() 関数を使います。

乱数を生成するためには、まず、乱数の種と呼ばれるランダムな数値を選出する際の基となるデータを初期化します。これはコンピュータ [...]]]></description>
			<content:encoded><![CDATA[<p>０からｎまでの乱数を取得するためには srand() 関数と rand() 関数を使います。</p>
<p><span id="more-489"></span></p>
<p>乱数を生成するためには、まず、乱数の種と呼ばれるランダムな数値を選出する際の基となるデータを初期化します。これはコンピュータが乱数の生成を不得手としていて、なにか参考になる値でも受け取らないと乱数のらの字も作れないためです。</p>
<div class="hl-surround" style="height:16.8px;"><div class="hl-main"><pre><span class="hl-identifier">srand</span><span class="hl-brackets">((</span><span class="hl-types">unsigned int</span><span class="hl-brackets">)</span><span class="hl-identifier">time</span><span class="hl-brackets">(</span><span class="hl-prepro">NULL</span><span class="hl-brackets">))</span><span class="hl-default">;</span></pre></div></div>
<p>srand() 関数は符号なし整数値を指定するのですが、例のように time() 関数の戻り値をキャストするのが大人気です。練習ならこれで問題ないのですが、人に見せるプログラムを作る際には /dev/random のような乱数生成デバイスの値を取得するのが良いと思います。</p>
<p>srand() 関数の実行が終わったら rand() 関数の出番です。 rand() 関数は０から RAND_MAX 定数が定める数値までの乱数を返します。たとえば０から１０までの乱数を受け取りたい場合は次のように書きます。</p>
<div class="hl-surround" style="height:16.8px;"><div class="hl-main"><pre><span class="hl-types">int </span><span class="hl-identifier">random_number</span><span class="hl-default"> = </span><span class="hl-identifier">rand</span><span class="hl-brackets">()</span><span class="hl-default"> % </span><span class="hl-number">11</span><span class="hl-default">;</span></pre></div></div>
<p>０から１０までの乱数を受け取りたいのになぜ 11 を指定するのかというと、０から１０までの整数を並べると 11 個になるためです。要素が 10 個ある配列の添え字の最大値が９なのと同じことです。</p>
<p>しかしながら、ゲームを作る場合はメルセンヌツイスタの利用を検討いただくのが最適です。聞くところによると Boost にメルセンヌツイスタの関数があるらしいので今度試してみます。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/489/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>15 パズルを作る（第８夜） &#8211; タイルをランダムにシャッフルする</title>
		<link>http://www.game-create.com/archives/75</link>
		<comments>http://www.game-create.com/archives/75#comments</comments>
		<pubDate>Tue, 11 Sep 2007 10:40:25 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[１５パズル]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[乱数]]></category>
		<category><![CDATA[練習]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=75</guid>
		<description><![CDATA[タイルをランダムにシャッフルするのも rand() 関数で可能です。
しかし

15 パズルを開始するためのシャッフルはただ単純に rand() を使うだけではダメです。たとえばタイルの情報を tiles 配列に保存する [...]]]></description>
			<content:encoded><![CDATA[<p>タイルをランダムにシャッフルするのも rand() 関数で可能です。</p>
<p>しかし</p>
<p><span id="more-75"></span></p>
<p>15 パズルを開始するためのシャッフルはただ単純に rand() を使うだけではダメです。たとえばタイルの情報を tiles 配列に保存するとして、シャッフルを次のように書いたとします。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-types">int </span><span class="hl-identifier">tiles</span><span class="hl-brackets">[</span><span class="hl-number">15</span><span class="hl-brackets">]</span><span class="hl-default"> = </span><span class="hl-brackets">{  </span><span class="hl-number">1</span><span class="hl-code">,  </span><span class="hl-number">2</span><span class="hl-code">,  </span><span class="hl-number">3</span><span class="hl-code">,  </span><span class="hl-number">4</span><span class="hl-code">,
                   </span><span class="hl-number">5</span><span class="hl-code">,  </span><span class="hl-number">6</span><span class="hl-code">,  </span><span class="hl-number">7</span><span class="hl-code">,  </span><span class="hl-number">8</span><span class="hl-code">,
                   </span><span class="hl-number">9</span><span class="hl-code">, </span><span class="hl-number">10</span><span class="hl-code">, </span><span class="hl-number">11</span><span class="hl-code">, </span><span class="hl-number">12</span><span class="hl-code">,
                  </span><span class="hl-number">13</span><span class="hl-code">, </span><span class="hl-number">14</span><span class="hl-code">, </span><span class="hl-number">15  </span><span class="hl-brackets">}</span><span class="hl-default">;
</span><span class="hl-types">int </span><span class="hl-identifier">i</span><span class="hl-default">, </span><span class="hl-identifier">src</span><span class="hl-default">, </span><span class="hl-identifier">dst</span><span class="hl-default">, </span><span class="hl-identifier">wrk</span><span class="hl-default">;

</span><span class="hl-comment">// 100 回シャッフルする
</span><span class="hl-reserved">for </span><span class="hl-brackets">(</span><span class="hl-identifier">i</span><span class="hl-code"> = </span><span class="hl-number">0</span><span class="hl-code">; </span><span class="hl-identifier">i</span><span class="hl-code"> &lt;</span><span class="hl-number">100</span><span class="hl-code">; </span><span class="hl-identifier">i</span><span class="hl-code">++</span><span class="hl-brackets">) {
  </span><span class="hl-comment">// ランダムに入れ替えるポイントを決定する
  </span><span class="hl-identifier">src</span><span class="hl-code"> = </span><span class="hl-identifier">rand</span><span class="hl-brackets">()</span><span class="hl-code"> % </span><span class="hl-number">15</span><span class="hl-code">;
  </span><span class="hl-identifier">dst</span><span class="hl-code"> = </span><span class="hl-identifier">rand</span><span class="hl-brackets">()</span><span class="hl-code"> % </span><span class="hl-number">15</span><span class="hl-code">;
  </span><span class="hl-comment">// src と dst の値を入れ替える
  </span><span class="hl-identifier">wrk</span><span class="hl-code">        = </span><span class="hl-identifier">tiles</span><span class="hl-brackets">[</span><span class="hl-identifier">src</span><span class="hl-brackets">]</span><span class="hl-code">;
  </span><span class="hl-identifier">tiles</span><span class="hl-brackets">[</span><span class="hl-identifier">src</span><span class="hl-brackets">]</span><span class="hl-code"> = </span><span class="hl-identifier">tiles</span><span class="hl-brackets">[</span><span class="hl-identifier">dst</span><span class="hl-brackets">]</span><span class="hl-code">;
  </span><span class="hl-identifier">tiles</span><span class="hl-brackets">[</span><span class="hl-identifier">dst</span><span class="hl-brackets">]</span><span class="hl-code"> = </span><span class="hl-identifier">wrk</span><span class="hl-code">;
</span><span class="hl-brackets">}</span></pre></div></div>
<p>すでにお気づきの方もいらっしゃるかと思いますが、実はランダムにシャッフルすると 15 パズルが完成しない場合があるのです。私は知能不足で数学的な裏付けがとれないのですが、とにかくシャッフルはあたかも本当に手作業でシャッフルしているかのように書く必要があるのです。</p>
<p>これでゲームプログラマの学友が３人くらいハマっていました。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/75/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>15 パズルを作る（第７夜） &#8211; 空白のマスをランダムに決定する</title>
		<link>http://www.game-create.com/archives/73</link>
		<comments>http://www.game-create.com/archives/73#comments</comments>
		<pubDate>Mon, 10 Sep 2007 12:28:12 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[１５パズル]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Win32API]]></category>
		<category><![CDATA[メルセンヌツイスタ]]></category>
		<category><![CDATA[乱数]]></category>
		<category><![CDATA[練習]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=73</guid>
		<description><![CDATA[4 x 4 の 16 タイルのうち、ひとつを空白にしてスライドできる状態にする必要があります。その空白をランダムに決定するために１から 16 までの乱数（ランダムな数値）が必要です。
乱数の生成に関してはメルセンヌツイス [...]]]></description>
			<content:encoded><![CDATA[<p>4 x 4 の 16 タイルのうち、ひとつを空白にしてスライドできる状態にする必要があります。その空白をランダムに決定するために１から 16 までの乱数（ランダムな数値）が必要です。</p>
<p>乱数の生成に関してはメルセンヌツイスタという有名なアルゴリズムがあるのですが、たいしたゲームではないのでC言語の標準ライブラリを使うことにします。</p>
<p><span id="more-73"></span></p>
<p>まず stdlib.h をインクルードします。</p>
<div class="hl-surround" style="height:16.8px;"><div class="hl-main"><pre><span class="hl-prepro">#include </span><span class="hl-quotes">&lt;</span><span class="hl-string">stdlib.h</span><span class="hl-quotes">&gt;</span></pre></div></div>
<p>次に乱数の種を設定します。これを抜かすと規則のある乱数になってしまいゲームの仕様を満たしません。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-comment">// 現在の時間を乱数の種にする
</span><span class="hl-identifier">srand</span><span class="hl-brackets">(</span><span class="hl-identifier">timeGetTime</span><span class="hl-brackets">())</span><span class="hl-default">;</span></pre></div></div>
<p>乱数は rand() 関数で取得します。</p>
<div class="hl-surround" style="height:16.8px;"><div class="hl-main"><pre><span class="hl-identifier">rand</span><span class="hl-brackets">()</span><span class="hl-default">;</span></pre></div></div>
<p>乱数は広い範囲の数値を返すため０～ｎまでの数値を取得したい場合は次のように書きます。</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-comment">// 100 はサンプルです
</span><span class="hl-identifier">rand</span><span class="hl-brackets">()</span><span class="hl-default"> % </span><span class="hl-number">100</span><span class="hl-default">; </span><span class="hl-comment">// 値が 0 ～ 99 の範囲になります</span></pre></div></div>
<p>たまに使うテクニックです。</p>
<p>乱数が取得できましたので仕様を満たすことになります。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/73/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
