過去の日記

2008-11-14

Java EXpert #03 買った [book]

NetBeans 入れられるようにHDD整理しなきゃな……。

Java Expert #03

  • 作者: Java Expert 編集部
  • 出版社/メーカー: 技術評論社
  • 発売: 2008-11-13
  • ASIN: 4774136778
  • メディア: 大型本
  • amazon.co.jp詳細へ

2008-11-13

世界記の迷宮II 六花の少女 [comic]

「この短銃で30mピンホール… 私にできるか!?」
台詞とキャラがあってない!

世界樹の迷宮2~六花の少女 上巻 (IDコミックス REXコミックス)

  • 作者: アトラス
  • 出版社/メーカー: 一迅社
  • 発売: 2008-11-08
  • ASIN: 4758061157
  • メディア: コミック
  • amazon.co.jp詳細へ

六花は雪の異称です。


2008-11-12

これは何……? [comic]

判型は 18cm × 13cm。

GUーGUガンモ (少年サンデーコミックススペシャル)

  • 作者: 細野 不二彦
  • 出版社/メーカー: 小学館
  • 発売: 2008-11-07
  • ASIN: 4091215580
  • メディア: コミック
  • amazon.co.jp詳細へ

機動警察パトレイバー (少年サンデーコミックススペシャル)

  • 作者: ゆうき まさみ
  • 出版社/メーカー: 小学館
  • 発売: 2008-11-12
  • ASIN: 4091215599
  • メディア: コミック
  • amazon.co.jp詳細へ

本屋で直に見た方が早いか。

楽園の泉 読了 [novel]

長かった。ずいぶんと時間がかかった。

楽園の泉 (ハヤカワ文庫SF)

  • 作者: アーサー・C. クラーク
  • 出版社/メーカー: 早川書房
  • 発売: 2006-01-01
  • ASIN: 415011546x
  • メディア: 文庫
  • amazon.co.jp詳細へ

読み終えて、(布製の)カバーを外して、本来のカバーに戻したとき、表紙を見て"あぁ"と思った。
小説では掴みそこねていたヴィジュアルイメージが、あった。

峻厳たる頂から立ち昇る「泉」。


これだけ有名な作品について今更あれこれ書こうとは思わないけど、FOUNTAINS という言葉のイメージの豊さ。
これをタイトルに使った感性の確かさに脱帽。


さて、ようやくこれで

ふわふわの泉 (ファミ通文庫)

  • 作者: 野尻 抱介
  • 出版社/メーカー: エンターブレイン
  • 発売: 2001-04
  • ASIN: 4757704054
  • メディア: 文庫
  • amazon.co.jp詳細へ

が好き! って胸を張って言えるかな、と思った。
(しかし……この作品を本当に増刷しない気なのか。エンターブレイン)

プログラミング…… [徒然]

あぁ、本当にブランクを心配した方がいいのかしらん。
ヘコむなぁ。


2008-11-11

娘と話す「文化ってなに?」 [気になる本]

AmazonやBK1だと

娘と話す文化ってなに?

書名にカギ括弧か何か欲しいところだけど、目録規則がそれを許さない!
のだろう。きっと。

娘と話す 文化ってなに?

  • 作者: ジェローム クレマン
  • 出版社/メーカー: 現代企画室
  • 発売: 2008-11-01
  • ASIN: 4773808128
  • メディア: 単行本
  • amazon.co.jp詳細へ

(BK1 内容説明より)
「もうフランス国民なんていらないんじゃない?」「地球規模の文化は誕生すると思う?」 さまざまな文化が入り乱れるヨーロッパで暮らす父娘が、対話を通して、現代における「文化」のあり方を探る。

読んではみたいな。図書館に期待。


そろそろ、気になる本カテゴリの棚卸しでもするかな……。(図書館への入荷チェックとか)

封じられた街 [気になる本]

YA叢書でのホラーか。どんな感じか読んでみたいな。

封じられた街-北風のポリフォニー (TEENS' ENTERTAINMENT4)

  • 作者: 沢村 鐵
  • 出版社/メーカー: ポプラ社
  • 発売: 2008-11-08
  • ASIN: 459110589X
  • メディア: 単行本
  • amazon.co.jp詳細へ

消費されるコンテンツ [news]

韓国でハリウッド大手映画会社がDVD販売から撤退というニュース。

ワーナーホームビデオコリア、イ・ヒョンリョル代表は「今まで良質なビデオとDVDを最も手軽に、また最も安い価格で楽しめるように前防衛的な努力をしてきた。しかし変化に適応し、先行しなければ淘汰される。消費者の購買形態は、優れたデジタルインフラを基盤に大きく変化した。今後も良質のコンテンツが合法的に消費される、健全な市場を作るために努力する」と明らかにした。

innolife.net>>>韓国ニュース>>>ムービー>>>ワーナーブラザーズ韓国で一部事業撤収


訳文とはいえ、

今後も良質のコンテンツが合法的に消費される

という表現は気になる。気持ち悪い。
しかし、確かに、現状を正しく表現しているようでもある。

人権宣言 [etc]

の格好いい動画。


"家"ができあがるところのシークェンスが好きだな。


via

swissmiss: Universal Declaration of Human Rights

The End [etc]

説明不要。百聞如一見。

Flickr: The The End Pool


via

swissmiss: The End


2008-11-10

HOTEL [comic]

SFだな!
しかしなんという特装版。(印刷の版が特別、普通の製版じゃない、という意味)。
だからかお値段高め。
つまり、部数としてはすごいヒットにはなれないけれども、確実にこれだけの部数は売れる、という見込みがあっての判断だろう。

Boichi 作品集 HOTEL (モーニング KC)

  • 作者: Boichi
  • 出版社/メーカー: 講談社
  • 発売: 2008-10-23
  • ASIN: 4063727459
  • メディア: コミック
  • amazon.co.jp詳細へ

そしてここに、某ブログのレビューを見て買ってしまった者が一人。

……ヨハネの黙示録を指す場合は"Apocalypse"じゃなくてなんだっけ? "Revelation"、いや定冠詞を付けて"the Revelation"か。複数形の方は俗称なんだ。へー。

Javaで指定範囲の乱数生成のlong版が欲しい、という話 [java]

ところで、Javaの乱数ではnextInt(int)というメソッドがあるので、intだと範囲指定して乱数を得ることができます。

けどもnextLong(long)というメソッドはないので、longだと範囲指定して乱数を得ることができません。

なにも考えなければ

nextLong() % n;

などとすると範囲を抑えれるのですけど、乱数としてちゃんとなるためには、もう少し頭を使ったほうがいいような気がします。

2008-11-10 - きしだのはてな

n が 2^m の形になっているならば、[0, Long.MAX_VALUE) を均等に分割するので、剰余を取ればいいです。


それ以外の時は、均等に分割されないので、小さい方が多くでてきます。
簡単のために MAX_VALUE が15 だとしましょう。乱数が 0 から 15 の範囲ででてきます。
これを 0 〜 2 の範囲に絞りたくて 3 で剰余を取ってしまうと

  • 0 (0, 3, 6, 9, 12, 15)
  • 1 (1, 4, 7, 10, 13)
  • 2 (2, 6, 8, 11, 14)

となって、0 が 1つ多く(15の分)出現します。
なので、15が出たらこれを棄てたいです。


ということで話を元に戻すと、「MAX_VALUE 以下で n の倍数のうち最大のもの」未満を採用して、それ以上なら棄てます。

で、実際 java.util.Random#nextInt(int)の実装は、

    public int nextInt(int n) {
        if (n <= 0)
            throw new IllegalArgumentException("n must be positive");

        if ((n & -n) == n)  // i.e., n is a power of 2
            return (int)((n * (long)next(31)) >> 31);

        int bits, val;
        do {
            bits = next(31);
            val = bits % n;
        } while (bits - val + (n-1) < 0);
        return val;
    }

となっています。2のべき乗かどうかの判定や、上に書いた判定がちょっとだけトリッキーですが。

乱数で出てきた数(bits)から剰余(val)を引くと、bit 以下で最大の n の倍数が出ます。これに (n-1) を足して MAX_VALUE を超えて桁あふれ*1を起こすと負数になってしまう。
そうだったら値を棄てる。そうでなければ採用。

という具合になっています。


(追記) 注意! ここから先は大嘘です!! コメント参照のこと!!


……しかし。


しかしですね。

いざlong版をコードにしようとする段になると気がつくはずです。
nextLong(long) なるメソッドが欲しい時は、引数に指定するのは、Integer.MAX_VALUE より大きい値の場合なんですよね。
Javaでは言語仕様で、Integer と Long の MAX_VALUE は決められていて実装依存などないわけですから、

nextLong() して、n 以上の値がでてきたら棄てればいい

ってことになるじゃないですか。(Integer.MAX_VALUE より大きい場合、2倍しただけで Long.MAX_VALUE を超えてしまうのがほとんどだから)

public long nextLong(long n) {
    if (n <= 0)
        throw new IllegalArgumentException("n must be positive");

    if (n <= Integer.MAX_VALUE)
        return (long)nextInt((int)n);

    long val;
    do {
        val = nextLong();
    } while (val >= n);
    return val;
}

これでおしまいだ! (注:コンパイル通してません)

なるほど、nextLong(long)が無いわけだ。と思いました。


これで大丈夫かどうかは、元々の乱数の質に依るのでこれだけでは評価できないです。
特定の乱数生成方法と相性が悪い、とかあるかもしれませんが、それは元々の乱数の質がよくないという意味でもありますし……。

もう少しだけ [java]

上で書いた nextLong(long) メソッドの中で、nextInt と nextLong の両方を使っている。
乱数生成の質が、nextInt の nextLong の両方で保証されてないといけないなぁ、と思った。

java.util.Random は実は long の大きさ(64bit長)を直接生成することはできない。nextLong() の実装は、int を2つ生成してビット結合するようになっている。
それだけではなく、

Random クラスによる nextLong メソッドの実装は、次と同等です。

 public long nextLong() {
   return ((long)next(32) << 32) + next(32);
 }

Random クラスは 48 ビットのみを含むシードを使用するため、このアルゴリズムは可能なすべての long 値の一部しか返しません

Random (Java Platform SE 6)

という但し書きが付いていたりする。


また、getDouble()なども、

[以前のバージョンの Java では、結果は次のように誤って計算されました。

 return (((long)next(27) &lt;&lt; 27) + next(27))
     / (double)(1L &lt;&lt; 54);

これでもある程度等しく思われますが、実際には、浮動小数点数の丸めでのバイアスのために大きなばらつきが生じるので、有効数字の下位ビットが 0 になることが 1 になることの 3 倍ありました。この程度のばらつきは実際には問題になりませんが、完全性を求めて修正を試みています。]

Random (Java Platform SE 6)

浮動小数点数の丸めの処理などは、1000speakers in Sendaiのために、資料を読んでいてちょうどでてきた部分(話す内容とは直接関係ないけど)なので、なるほどそういうことも気をつけないといけないのかぁ。

とかもね。

*1 でいいんだっけ?