Javaのenumとswitchとコンパイル結果

はてなブログから戻ってきました。これは過去記事のコピーです。

目的

Oracleの配布しているJDKと、Eclipseで使われるJDKで、コンパイル後のファイル数が違うケースに気づいたのでメモ。
switch文でenumを使う時のコンパイル結果についてです。

本題

Javaのenumが、ただの定数ではなくて特殊なクラスとして扱われるのは有名なことかと思います。EffectiveJava(読みかけ 汗)にも書いてありました。
クラスなので、コンパイルすればenum定義は一つの.classファイルになります。クラス内で定義したら、staticな内部クラスとして、やっぱり別の.classになります。

ところで、そんなenumの利点として、switch文の条件にできるという点があります。
では、このようなコードはコンパイルするとどういったファイル名になるでしょうか?

Person.java

public class Person {
    public void work(Day day) {
        switch (day) {
        case SAT:
            System.out.println("寝て過ごす");
            break;

        case SUN:
           System.out.println("遊びに出かける");
            break;

        default:
            System.out.println("働く");
            break;
        }
    }
}

Day.java

public enum Day {
    MON, TUE, WED, THU, FRI, SAT, SUN
}

Eclipseのコンパイル結果は予想通り

自分は、当然Person.classとDay.classの2つになると思ってました。
そして、Eclipseを使うとその通りになります。(バージョンは4.2と4.5で確認)

Oracle JDKでは違った

でも、OracleのJDK(1.7)のjavacを使ったら、
* Day.class
* Person.class
* Person$1.class
の3つになりました。なぜだ(・д・)

javap Person$1.class とすると、

Compiled from "Person.java"
class Person$1 {
    static final int[] $SwitchMap$Day;
    static {};
}

だそうな???

検索すると次のような記事に当たります

enumの値が変わったり増減したりしても、enumを使う側はコンパイルし直さなくても済むというのがenumの特徴です。そういった挙動を既存の文法だけで再表現するための実装として、Oracleのjavacでは内部的に勝手にクラスを作っていたんですね。そしてEclipseのコンパイラでは別の実装になっていると。

感想

Javaではクラスごとに.classファイルが作られることになっています。
しかも無名のクラスは$1のような通し番号のついたクラスになったりします。

実装依存なのだとしても、コンパイル後のファイル数まで違ってしまうのはなんとも気持ち悪いというか。
たとえば1つの.javaファイルから100個の.classが作られることも許されているのかなみたいな。
コンパイル後のことなんて気にするなと言われれば、まぁそうなんですが…(‘_’)ナンダカナー

ブログ引っ越し(仮)

先々週に、はてなブログに登録しました。
むこうの方が技術ブログ系は揃ってるので、流れに乗れるかな~なんて。
 ひとまず3本書いてみました。
VS2015ならconstexprでコンパイル時演算でき…ない??
うーん、はてブだからってそう簡単にアクセス数が増える訳ではないですね(・ω・;)
こちらの方が一定アクセス常にある感じ。
メルセンヌツイスターを扱った記事だけ妙にアクセスがあったりと、どういった記事に需要があるのかいまいち分からない。
今後どちらをメインにするか、あるいは平行して書いていくか、まだこれから検討します(._.)
——– 2017年5月7日 追記ここから ——–
はてなブログよりwordpress.comのほうが、
アクセス数が多いみたいです。
有効なアクセスの割合がどうなのかは分かりませんが、
こっちに戻ってきてみました。
——– 2017年5月7日 追記ここまで ——–

JSONとAjaxの勉強

さいきんJavaScriptを触る機会がありました。
使うとなったときには急いでパーフェクトJavaScriptを買いに行きました(・ω・)いやー良いシリーズですね

それまではわりと、Ajaxの非同期通信というと難しい,凝ったアプリ作りたい時に使うもの くらいの認識だったんですが、
意外と手軽に身近に使えるものなのだなと。
あと、その時は使わなかったんですが、
AjaxではJSONでデータのやりとりをすることが多いのですね。

勉強したことを復習がてらメモめも(._.)φ

まずはサーバー側。JavaのServletで。
とりあえずこんな感じでJSONファイルをレスポンスとして返す。ちょっとぱっと見ではわかりにくいですね。
話はそれますが、最近はweb.xml書かなくてもアノテーションでURLマッピング書けるということで、こういう時便利ですね(・ω・)

// importとか省略

@WebServlet("/Json1")
public class Json1 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("application/json;charset=UTF-8");
        PrintWriter out = response.getWriter();

        out.print("{"
                + "  \"vegetable\" : [\"tomato\", \"carrot\"], "
                + "  \"fruit\" :  [\"orange\", \"apple\", \"strawberry\"]"
                + "}");
    }
// doPostは省略

}

そしてサーバーにリクエスト投げるhtmlがこれ

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script>
  function createList() {
    var xmlhr = new XMLHttpRequest();
    xmlhr.open('GET', 'http://localhost:8080/WKWKWeb/Json1', false);  // まずは同期通信
    xmlhr.send(null);

    if (xmlhr.status == 200) {
      var data = JSON.parse(xmlhr.responseText);
      var lists = document.getElementById("lists");

      // ループでJSONファイルからの各要素をリストに追加
      for (group in data) {
          // level1
          var dt = document.createElement("dt");
          dt.textContent = group;

          // level2
          for (i = 0; i < data[group].length; i++) {
              var dd = document.createElement("dd");
              dd.textContent = data[group][i];
              dt.appendChild(dd);
          }
          lists.appendChild(dt);
      }
    }
  }
</script>
</head>
<body>
  <input type="button" value="リストを取得" onClick="createList()" />
  // ここに要素が足される

<dl id="lists"></dl>


</body>
</html>

これだけで、ボタンを押すとAjaxでJSONデータを取ってきてリストに追加できる。
ゴチャゴチャしてるけど、ほとんどは読み取ったデータをリストに詰め替える作業で、Ajax自体は簡単じゃないですか~(・д・)

====

さすがにこれでは使いにくいので、ちょっと改良する。
(Ajaxなのに同期通信だし…)

あと、気分も含めJSPつかってみる。直接JSP呼ぶのって常に悪手なのかな。

<%@ page language="java" contentType="application/json; charset=UTF-8" %>
{
    "vegetable" : ["tomato", "carrot"],
    "fruit" :  ["orange", "apple", "strawberry"]
}

クライアントはJavaScriptの部分だけ

function createList() {

  var xmlhr = new XMLHttpRequest();
  xmlhr.onreadystatechange = function() {  // 非同期通信!
    if (xmlhr.readyState == 4) {
      if (xmlhr.status == 200) {
        var data = JSON.parse(xmlhr.responseText);
        var lists = document.getElementById("lists");

        for (group in data) {
          // level1
          var dt = document.createElement("dt");
          dt.textContent = group;

          // level2
          for (i = 0; i < data[group].length; i++) {
            var dd = document.createElement("dd");
            dd.textContent = data[group][i];
            dt.appendChild(dd);
          }
          lists.appendChild(dt);
        }
      }
    }
  };

  xmlhr.open('GET', '/WKWKWeb/Json2.jsp');  // 記述の順番が逆になってしまうのは平行処理の宿命か
  xmlhr.send(null);
}

非同期処理できましたね!確認してないけどきっと出来てるよね!
JSPってHTMLに毛が生えた感じ程度の認識だったけど、
こうやって使うと、あぁサーバー側の処理なんだなぁと実感しますね。

====

実際にはJSPに固定でJSONデータなんて打ち込むことは無いだろうし、
クライアントもjQueryくらい使うでしょう。
ってことで第3のバリエーション。

// ライブラリ使いました
import net.arnx.jsonic.JSON;

@WebServlet("/Json3")
public class Json3 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    // JSONに変換されるクラス
    // privateフィールドとpublicアクセサの組でも良いらしい
    public class Foods {
        public String[] vegetable;
        public String[] fruit;
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("application/json;charset=UTF-8");

        // JSONデータの生成
        Foods foods = new Foods();
        foods.vegetable = new String[]{ "tomato", "carrot" };
        foods.fruit = new String[]{ "orange", "apple", "strawberry" };
        String json = JSON.encode(foods);

        // クライアントに返却
        PrintWriter out = response.getWriter();
        out.print(json);
    }
}
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script>

  function createList() {
    $.ajax('/WKWKWeb/Json3', {
      type : 'GET',
      dataType : 'json',
      success : function(data, status, xmlhr) {

        for (group in data) {
          // level1
          var dt = $('<dt></dt>')
                .text(group);

          // level2
          $.each(data[group],
            function(idx, elem) {
              $('<dd></dd>')
                .text(elem)
                .appendTo(dt);
            }
          );

          dt.appendTo('#lists');
        }
      }
    })
  }
</script>

世間では常識となった(らしい)jQueryと、
どの程度有名なのか分からないけどJSONICというJavaのインスタンスとJSON形式文字列の相互変換ライブラリを使ってみました。
実際に何か作る時には最低限このくらいはしたいなー。
jQueryの作法とか知らないのでもっと便利な書き方はあるのかもしれないし、
JSONICの方もpublicなフィールドを直接使ってしまってJavaっぽくない書き方してしまいましたが、
とりあえず便利ですね(・ω・)

世間の人からしたら常識なのかもしれないけど、
Webではなく画像処理とかCGとかやってた人間からすると、
知らないことが多いですね。

乱数の種類と各言語の標準実装

ひたすらに放置していたブログですが、年末にふと思い立って開いたら、
乱数についての記事は少しずつアクセスがあるよう(どなたかがリンクしてくださったそう)なので、乱数について最近調べたことを書こうと思います(・д・)

C++11で標準ライブラリに追加された乱数生成アルゴリズムについては以前の記事で書きました。
では、他の言語の乱数は?
というのがテーマです。
一応、(準)標準ライブラリの範囲にします。

乱数の種類

具体的な実装の話をする前に、面白い話を聞いたので、余談に近いですが乱数の種類について。
コンピュータで生成する「乱数」にも、目的(必要な性質)によってそれぞれ適するアルゴリズムが必要です。

自分が知る範囲では、乱数として求められる性質は次の3種類のいずれか(または組み合わせ)です。

  1. (人間的には不規則に見える順で)それぞれの値の出る確率が等確率かつ周期性が低い
  2. これまでに出た値から次の値が推測できない
  3. どの値も均等に出ているように人間が感じる

1は数値シミュレーションなどでの利用を想定して書いています。詳細は省きますが、古くはモンテカルロシミュレーションとか、今なら確率的最適化とか。次にどんな値が出るか推測されても困らないけど、良い結果を得るためにはランダム性が必要な場合です。何度も連続で乱数生成することが多いため、同時に速度も求められます。

2は暗号アルゴリズムや関連アルゴリズムの中での利用に必要な性質です。
一定水準は等確率で色々な値が出ることが必要ですが、それよりもとにかく「推測されない」ということが重要です。
そして、こういった大事な話はブログで下手に触れることができないので、IPAのセキュア・プログラミング講座 第3章破られにくい暗号技術と擬似乱数の使用でも見てくださいまし(._. )

最後に3ですが、これが興味深くて。ゲームとかでランダムな値が欲しい時の話です。
どうやら人間は、ランダムな値について、あまりランダムでないと感じてしまうらしいんです。
それで、完全ランダムより少し調整を加えてみると、ランダムであると感じるのだとか。北陸先端科学技術大学院大学の池田研というところで研究がされているそうなので、興味がある人はぜひ一読を。
偏りがあるように思わせない(偏った)乱数生成 北陸先端科学技術大学院大学(JAIST) 情報科学研究科 池田研究室

各言語の標準実装

やっと本題。各言語の(準)標準ライブラリの擬似乱数生成アルゴリズムについて調べたものをまとめます。
さっきもチラッと書きましたが、暗号で使うようなアルゴリズムについては基本触れません。Javaであれば、Randomクラスには触れるけどSecureRandomクラスには触れません。

C++03(C++11より前)

srand()でシード指定、rand()で乱数生成という昔ながらの方法です。

  • 線形合同法

boostを使うと以下が増えます。

  • 線形合同法(パラメータ調整可)
  • メルセンヌ・ツイスター法
  • キャリー付き減算法(主にRANLUX法)
  • Lagged Fibonacci法
  • (上記アルゴリズムにパラメータを設定した代表的アルゴリズム各種)

C++11以降

<random>ヘッダーをincludeして使うクラス。boostと入っているアルゴリズムが違うのか、分類方法が違うだけなのか、専門でないので判別が難しいのですが…。

  • 線形合同法
  • メルセンヌ・ツイスター法
  • キャリー付き減算法(主にRANLUX法)
  • (上記アルゴリズムにパラメータを設定した代表的アルゴリズム各種)

もちろん、boostも使えます。が、boostは使うの面倒だったりするので標準になったのは嬉しいところ。

Java

java.util.Randomクラスを使う。java.lang.Math.random()メソッドも、内部ではこのRandomクラスを使っている。

  • 線形合同法

Javaは仮想マシンによって内部実装が違いますが、乱数生成に関しては生成式まで含めて仕様になっているので、どの仮想マシンでも同じ挙動になっているはず。
昔のバージョンではnextDouble()メソッドの計算に問題があったそうで、途中のバージョンから仕様変更を行ったと公式ドキュメントに書いてあります。

C#

Javaと違って、計算式までは仕様になっていない?ちょっと記述が見つけられませんでした。
Microsoftの実装のMath.Randomクラスでは、

  • 線形合同法(D. E. Knuthによる改良版アルゴリズム)

だそうです。
C++11(boost)でも同じアルゴリズムは使用可能です。

Python

randomモジュールを使う。

  • メルセンヌ・ツイスター法

2.2以前はWichmann-Hillのアルゴリズムというものだったそうですが、2.3からメルセンヌ・ツイスター法が標準になりました。Python 2.x系列では、WichmannHillクラスを使うと古い方のアルゴリズムも使えますが、あくまで後方互換目的です。

Ruby

何年も全く触っていないけど、Python調べたからRubyも一応調べてみた。
とりあえずRandomクラスを使うとメルセンヌ・ツイスター法になるらしい。
マイナーバージョンアップでも内部実装変わっってしまうのか…Rubyこわい(´・ω・`)

おわりに

こうやって見ると、C++11の標準は選択肢が広いですね。速度と精度のトレードオフを考えられる人向けでしょうか。
Javaは数値計算なんて想定してないのでしょう。
初心者でも安心のPython。
擬似乱数生成アルゴリズムだけでもそれぞれ言語の違いが出て面白いですね(・ω・ )

C++とVisual Studio 2012,2013でファイル操作

[追記]
VS2012,2013ではBoost.Filesystem V2 相当でしたが、
VS2015ではBoost.Filesystem V3 相当になるらしい。(そしてたぶんほぼそのままC++17で標準化される)
https://msdn.microsoft.com/ja-jp/library/hh874694.aspx

—————-

後輩が調べ物していてこのブログを見つけたとかでちょっとモチベーション上がりました(・ω・)お久しぶりです。
で、その後輩がC++でファイル/ディレクトリ操作をするのに面倒なことをしていたので教えつつメモ。

標準のC++には未だにファイル/ディレクトリ操作をする方法が存在しないとかなんとか。
でも、BoostにはFilesystem Libraryというのがあって便利に扱える。
ただ、そのためだけにBoostを入れるのもなんだか面倒。
もしやと思って調べたら、Visual Studio 2012以降では標準で同様の機能がstd::tr2::sysとして入っていました。
ちなみにGCCには見当たらないようです。そのせいか、Boost以外でも使えるという情報は意外と少なかった。たまにはVisualStudioユーザーがGCCユーザーより得をしても罰は当たらないと思う。

Boost.filesystemの最新版よりやや古い仕様らしく、これから先どうなるか分かりませんが、
VS2012, 2013ユーザーはひとまずこれで事足りますね(・ω・)

std::tr2::sysというのが面倒&これから先の仕様変更にも強くなるので、別名を割り当てるとか何とかしたほうが良いかと。

#include &amp;lt;iostream&amp;gt;
#include &amp;lt;filesystem&amp;gt;

namespace filesystem = std::tr2::sys;

int main(int argc, char* argv[])
{
	filesystem::path file_path(&amp;quot;D:\\Hoge\\foo.txt&amp;quot;);
	std::cout &amp;lt;&amp;lt; file_path.stem() &amp;lt;&amp;lt; std::endl;			//foo
	std::cout &amp;lt;&amp;lt; file_path.extension() &amp;lt;&amp;lt; std::endl;	//.txt

	file_path = filesystem::path(&amp;quot;C:\\Fuge.Fuga\\bar&amp;quot;);
	std::cout &amp;lt;&amp;lt; file_path.stem() &amp;lt;&amp;lt; std::endl;			//bar
	std::cout &amp;lt;&amp;lt; file_path.extension() &amp;lt;&amp;lt; std::endl;	//何も表示されない

	return 0;
}

参考サイト:
Boost Filesystem Library Version3
boost::filesystem::path | wata_d’s diary
C++1y – Filesystemライブラリの提案 | Faith and Brave – C++で遊ぼう

ぽちぽちツール

最近Pythonはじめました(・ω・)
それから、C#も使うようになりました(・ω・)

研究室でこういう事言うと、
「何の利点があるの?」
的なことを聞かれます。
(テキトーなこと答えたりしてます。)

C#を使っているのは、
そこそこしっかり使えるGUIを作るのが簡単だから。
簡単さという意味では別の選択肢もあるかもしれませんが、
現状僕の知っている方法のなかで、一番無難に実用的な処理が書けるので。
GUIデザイナもあるしね。
そう、C#については答えられる。

Pythonを使う理由に関しては、
正直そんなにはっきりしたもの“まだ”もっていない。
でも、それってダメですか??

研究室には割とコンサル向きな人が多いんですが、
そういう人ってわりと理由/利点を求めるんですよね。
だけど、そういう人は、便利なものを知らない、知る機会を持っていない。
そんな風に最近思いました。
なんとなく便利そうだから、とりあえず勉強してみる。
使ってみて便利だったらこれからも使う、そうでなければ記憶の片隅にとどめておく、
自分の所属する集団ではあまり感じませんが、
エンジニアの人ってそういう発想持っている人が多そう。

そんなことを最近参加したイベントとかで感じました。

あと、プログラミングしてるなら、
コードを外に公開する/公開されているコードを見る というのはやはり重要ですよね。
そんなわけで、私の作ったプログラムを公開します
見苦しいかもしれませんがご了承を(._.)

初めてのGitHubです。
アカウント作りました。

少なくとも現状では他の人に利点はほとんど無いかと…(・ω・;)汗
ただ、公開したかったということと、
もしかしたら他にもこういうツールを使う人がいるかもしれないので。

本当は他のプログラムも公開したい気分ですが、
いかんせん研究関連のコードばかりなので。
今回のも研究関連ではありますが、
論文とは直接関係ないのでOKということで。

今回作成したのは、
画像の特徴点手動抽出ツール(通称ポチポチツール)です。
https://github.com/wkwkhautbois/PochiPochi

私の専門は画像処理の分野なのですが、
複数の画像間で位置について対応を取る必要がある場合があります。
(例えば、2枚の画像をくっつけて1枚の大きな画像にしたい場合とか、継ぎ目が綺麗になるように調整が必要ですよね)
最近では、自動で画像の対応関係をとるアルゴリズム(SIFT, SURF etc…)が充実してきているので、
手動で指定する機会も少なくなってきていますが、
コンピューターってそんなに賢くないので、人間がいちいち指定してあげる必要のある場合も多いんですよね。

ただ、そうもいかない場面もちらほらありまして。
自動推定が失敗する場合もありますし。
人間が手作業で「こっちの画像のこの部分が、こっちの画像のここに対応してるよ~」って指定してあげる作業は未だに必要なんですよね。

で、そのためのツールをC#で組んでいました。
自分としては真面目に取り組んだのですが、、、
やはり知識/実力不足。
もともと情報系の学科でもないですし、
今でも基本は論文読んで勉強したり数式をゴニョゴニョしたりしてるものでプログラミングは得意では…(言い訳)

以前よりはマシになったと思うんですが、
まだオブジェクト指向っぽくない。
発想が違うんですかね。
あと、Observerパターンというのが使えたのですが、それを知ったのはプログラムを組み終えたあと…
デザインパターンの勉強もしないとですかね。

すごく汚いコードですが、
GItHubならそういうのも受け入れられると信じて…(`・ω・´)
(再掲) https://github.com/wkwkhautbois/PochiPochi
あ、一応MITライセンスを採用(・ω・)
商用利用とか再配布したい人がいたら調べてね、そんな人いない気がするけど(・ω・)

C++11で使える乱数 – メルセンヌ・ツイスター法 (`・ω・´)シャキーン

まだ2回目の更新でしょうか(・ω・;)
アカウントを作ったは良いものの、
諸事情により更新する時間が確保できず
(ブログの存在をしばらく忘れていたため)
こんなになってしまいました(汗)

ただ一つ分かったことがあります。
有名ブログとかに登録しておけば、
何も更新されていなくてもGoogle検索でヒットするようになるということです!

みなさんも、ブログ作ろうと思い立つ前にサイトだけ作っておくと幸せになれるかも。

今回はC++11の乱数について紹介を。
参考:
ゲーム開発者のためのC++11/C++14(SlideShare)
cppreference.com – Pseudo-random number generation

参考スライドはC++11全般について書かれていますが、
簡単かつ恩恵を受けられそうなものの代表として、
まずは参考スライド同様に乱数についてからにしようかと。
(あと、スライドの例そのままだとエラー吐かれたんですよね…)

—-

C/C++標準ライブラリの乱数については、
全然乱数でないことで有名ですね。
だいたいの用途には事足りるのかもしれませんが、
奇数より偶数のほうが出現しやすいとか、気持ち悪い仕様であります。

そんな需要に応えてか、C++11では、今までの標準rand()関数に加えて、
しっかりした乱数生成クラスが採用されたました。

古い仕様の関数を完全に置き換えてくれてもよかった気がしなくもないのですが、
新しいクラスとして追加です。
(クラスのため、C言語からは呼べないんですよね。大学の研究室=乱数が必要なところ とかでは未だに純粋Cを使ってたりすると思うんですが。)

たとえば、1から100までのランダムな整数がほしかったら

int main(){
  std::random_device rnddev;
  std::mt19937 mt(rnddev());

  std::uniform_real_distribution<double> rnd(1.0, 10.0);

  for(int i=0; i<10; i++){
    std::cout << rnd(mt) << std::endl;
  }

  return 0;
};

となります。

乱数生成のアルゴリズムは世界にたくさん存在しているが、上のコードは『メルセンヌ・ツイスター法』とかいうアルゴリズムを使っています。
決して 名 前 で 選 ん だ なんてことはありません(`・ω・´)
高速かつ十分ランダムな実用的乱数生成方法として知られているものです。
(うちの研究室でも使っています。)

std::uniform_int_distribution<int> rnd(1, 10);

の部分ですが、
-20から40までの整数がほしければ

std::uniform_int_distribution<int> rnd(-20, 40);

とすればいいですし、
実数(double精度)でほしければ

std::uniform_real_distribution<double> rnd(1.0, 10.0);

とすればOKです。

等確率で値が出るのが普通の乱数(一様分布)ですが、
たとえば正規分布状に値が出現してほしい時というのもあります。
C++11では、
・一様分布
・ベルヌーイ分布
・ポアソン分布
・正規分布
・サンプリング分布
が、標準で使えるようです。
平均が0、標準偏差が1の正規分布なら、

double mu = 0.0;
double sigma = 1.0;
std::normal_distribution<double> rnd(mu, sigma);

こんな感じ。
自分の場合、正規分布以外はあまり使う機会なさそうです…。

昔のsrand((unsigned)time(NULL));
に相当するのが

std::random_device rnddev;
std::mt19937 mt(rnddev());

です。
random_device というのが、時刻とか機械固有の番号とかを調べて乱数を作るためのクラスらしいです。
処理時間を気にしないのであればこのクラスだけを使ってもいいのだとか。
ただし遅いので、普通はメルセンヌ・ツイスターなどのアルゴリズムを使います。

それと、ランダム性をさらに上げたい場合には、
random_deviceでいくつか乱数を生成して、それら全部を考慮するみたいなことをするらしいです。
あと、本当はメルセンヌ・ツイスター法を使うためのクラス mt19937 も、簡単に使えるようにてきとーに(適切に)設定されたパラメータを使っているらしく、もっとカスタマイズ可能らしいです。それ以上はわかりません(・ω・)

C++に慣れていない人には、
rnd(mt);
の部分が不思議かもしれませんが、まぁこういうものです。
「rnd」って変数名なのに、関数みたいに使っていますからね。

よく、
「0から9までの数を得るためには、 rand()%10 とすればいい」みたいな話もあります。
昔のrand()関数を使って手軽に処理したい場合にはこれでもいいですが、ランダム性は低いです。
rand()関数の仕様がそもそも悪いことで有名ですし、
そうでなくても、割り算の余りを使うというのは安直すぎます。
仮に、0から9まで等確率で出現する関数f()があったとします。 f()%7は、3から6よりも0,1,2になりやすいですよね。スケールは違いますが、そういう状況は起きます。
っていうか、なんで昔のC言語の規約であんな中途半端な乱数が認められたのか…。