ここでは、UnityEngine.Randomを使えば99.9%解決するような話題について、 技術部平山が趣味で書いてみようと思います。 サンプルコードはgithubに置いてあります。 なお、マルチスレッドはあくまできっかけであり、本記事にスレッドの話はありません。 ただ、サンプルでは諸々の高速化のためにスレッドを使っております。 動機 少し前にAIを書いていた時、なにせ計算量が多いのでスレッドを使って並列化したいなと 思ったことがあります。 そうなると、使う乱数はマルチスレッドで呼べる奴じゃないとダメだなと。 しかし、UnityEngineの関数は他のスレッドから呼んではいけないという縛りがあります。 System.Randomを別個に持てばいいんですが、 System.Randomはずいぶん昔からある乱数です。 C言語のライブラリでは互換性のために標準の乱数が未だに昔のままで、 それを
マケプレのセールで買ったアセットが4.18未対応で泣いた。 ブループリントで乱数を生成するには、Rand Float in Range 等を使う。で、この ブログ を見ると分かる通り、帰ってくる乱数は例えば1-10までの整数乱数を生成するとだいたいどの数字も同じ確率で出現する。これを一様分布に従う一様乱数って言ったりする。まあ読んで字の如くなので難しくはない。 しかし一様乱数だけしかBPで使えないってのは不便。例えばコマンド式のRPG(ドラクエみたいな)でダメージ計算する時、計算結果に乱数を乗じて実際敵に与えるダメージに幅を持たせるといったことをするがこの時乗じる乱数が一様乱数だとどうも違和感が出てしまう。他にも敵キャラが自分に向けて銃で遠くから攻撃する場合、毎回正確にプレイヤーに弾が飛んできたらたまったもんじゃないので乱数を使って照準のズレをもたせたくなる。この場合も一様乱数を使うと外す
今回のエンジニアブログの担当は大橋です。 好きな乱数生成法はXorshiftです。 よろしくおねがいします。 さて、今回はUnityの乱数に関してです。 Unityには乱数を得るたものクラス(UnityEngine.Random)が用意されていますが、 これで得られる乱数は果たしてちゃんとランダムなのか気になったので、 ちょっと見てみました。 注)きちんとした乱数性能の評価ではないです。 Unityのバージョンは4.6.1f1、スクリプトはC#です。 ちゃんとしたランダムって? プログラムで使われる乱数は、正確には擬似乱数といって、真の乱数ではありません。 計算式によってランダムっぽい数列を求めているだけです(だけ、というと怒られそうですが)。 この擬似乱数の求め方にはいろいろな方法があるのですが、その性能も様々です。 例えば、性能が悪い方法を使うと、奇数と偶数が交互に出てきたりするので油
巷では、スマホは「手触り」が重要・・・って話が持ち上がりつつあるが、使い易さと気持ちよさを両方できる人材が不足している。広告Flash業界で培われたインタラクションのノウハウは、だんだんと失伝しつつあり、ビジュアルや動きをちゃんとコーディングできるスマホ系の人材なかなかいない。新しく勉強するパスもほとんどない。 そんなわけでTHE GUILDの社員研修として勉強会をすることに。目標は1年ぐらいでこの程度のモリモリ動くものを作れるようにすること。で、2年目に動きや手触りに、合理性や必然性、使い易さを付加できるとこまでもっていく。 第1回はインタラクティブの根幹となる乱数について。 1: 乱数とは ランダムな値を返す関数、機能。 乱数はインタラクティブ・プログラミングの根源。静的な絵とは根本に異なる、永遠に定着しない絵を作り出す。 インタラクティブなプログラミングでは、知識以上にその応用力が問
深津 貴之 / THE GUILD / note @fladdict アニメーションの監修で、「 Random();の代わりに、(Random()+Random()+Rrandom()+Random()+Random())/5.0f; を使うと、動きにコクが出る」と言ったら、ピュアオーディオ扱いされるのですが・・・これは根拠のあるアルゴです。 2016-11-03 11:29:43 深津 貴之 / THE GUILD / note @fladdict 乱数のコクをチューニングする話をすると、なぜピュアオーディオ扱いされるのか? みんな乱数の波動を、もっと体で感じようよ。全然ヴァイブレーションが違うよ。 2016-11-03 11:36:47
今日もたいがい、数学の話です。 一瞬、「動きにコクが出る」って表現で話題になったあれの話。 そっかー、アニメーション付ける人に一言で説明するには「コク」って言葉になるのかー… という衝撃は結構ありますが、まあ、乱数をいくつか足すと丸みが出るというの自体は事実。 ちゃんとした数学的な説明をすると、 中心極限定理によって、独立な乱数を数多く足せば足すほど正規分布に近づく 自然界は多数の独立な乱雑さが重なってできてるので結構な頻度で正規分布が出てくる 正規分布で作った図形は丸みがかってる(というか、完全に真円・真球を作れる) みたいな話です。 C#関係ない… こころなし程度にC#に関係している点というと、「Math.NET っていう数学ライブラリがあるよ」という話。 例: 2次元上の点の分布を作る 「丸み」の例として、2次元上の点(x, y)を乱数を使って作ることを考えます。 以降のサンプル コ
2015年12月17日、Google Chrome の JavaScript エンジン(処理系)である V8 の公式ブログにて、 JavaScript の標準的な乱数生成APIである Math.random() の背後で使われているアルゴリズムの変更がアナウンスされました。 Math.random() 関数は JavaScript を利用する際には比較的よく使われる関数ですので、親しみのある方も多いのではないかと思います。 新たなバグの発見や、従来より優秀なアルゴリズムの発見によってアルゴリズムが変更されること自体はそれほど珍しくはないものの、 技術的には枯れていると思われる Math.random() のような基本的な処理の背後のアルゴリズムが変更されたことに驚きを感じる方も少なくないかと思いますが、 それ以上に注目すべきはその変更後のアルゴリズムです。 実際に採用されたアルゴリズムの原
[CEDEC 2014]ナムコ作品で見る乱数の歴史。「ゲーム世界を動かすサイコロの正体 〜 往年のナムコタイトルから学ぶ乱数の進化と応用」レポート ライター:箭本進一 神奈川のパシフィコ横浜で行われた,ゲーム開発者向けイベントCEDEC 2014の最終日である2014年9月4日,「ゲーム世界を動かすサイコロの正体 〜 往年のナムコタイトルから学ぶ乱数の進化と応用」という講演が行われた。 登壇したバンダイナムコスタジオ HE技術部 加来量一氏 この講演のユニークな点は,旧ナムコの作品を「乱数」という視点から振り返るということだ。バンダイナムコスタジオ HE技術部のプログラマーである加来量一氏は,旧ナムコの初期作品50本を解析し,それぞれの時代でどのような乱数が使われていたかを特定した。そこから見えてくる乱数技術改良の歴史を見ていくというのが,講義の主旨なのである。 1980年代のナムコアーケ
世界最大の署名プラットフォームというchange.org上で、Linus Torvalds宛てに「Linuxカーネルの全体的なセキュリティを改善するために、RdRandを/dev/randomから取り除いてください」とする請願が書き込まれた。 これに対して、Torvalds氏は請願者の無知を厳しく非難している(本家/.、Party News記事)。 Linuxは請願者とその支持者らに対して、「drivers/char/random.cを読め。それから暗号法について学習したまえ。最後にここに戻って来て、世界に対して己の間違いを認めるんだ」と回答している。またTorvalds氏によれば、カーネル管理者らは自分達が何をやっているのか分かっているが、請願者は分かっていないとのこと。 RdRandはIntelのIvyBridge系CPUに搭載されている乱数生成命令で、NIST SP800-90やFI
私はつい最近まで勘違いしていました。 ここのページに書いてあるような方法で、一様分布する整数が得られると。 int random(int n) { return (int)(( rand() / (RAND_MAX + 1.0) ) * n); } この方法、一見すると実に一様分布が得られそうに見えるんですよね。 どういう思考回路を通っているかというのを自己分析すると、次のような感じです。 1. rand() では 0〜RAND_MAX のランダムな整数が得られる。 2. それを RAND_MAX + 1 で割ると、[0, 1) に一様分布する実数が得られる。 3. [0, 1) の一様な実数を n 倍して小数点以下を切り捨てたら、0 から n-1 に一様分布する整数が得られる。 これの罠なところは、1 と(特に)3 が正しいというところだと思います。 ただ、2 がダウト。 思いっきりダウ
How secure is Linux's random number generator? | Hacker News Hacker Newsで話題になっていたので。 主に暗号用途には、予測不可能な乱数が必要となる。予測不可能というのは、実装と内部状態が知られていても、なお将来の乱数が予測できないということだ。 たとえば、擬似乱数としてよく使われる線形合同法(Linear congruential generator)は、以下のように書ける。 namespace lcg { thread_local unsigned int seed ; void srand( unsigned int seed ) { lcg::seed = seed ; } int rand( void ) { // glibcの使っている値を拝借 seed = (1103515245 * seed + 12345
Quantum random number generator なかなか斬新な方法で真の乱数を生成する方法が発表された。 その方法とは、光をふたつにわけ、それぞれ光の強さを計測する。光というのは量子化されているから、わけられたそれぞれの光の強さは増減する。この増減の情報は、真の乱数として利用できる。 私は常々、すべての通信を暗号化することが重要になる将来、コンピューターは真の乱数を高速に生成するデバイスを搭載するべきではないかと考えているのだが、なかなか実用化されない。まあ、放射性物質とガイガーカウンターと外部の影響を遮断するための分厚い壁からなる真の乱数生成デバイスは、普通のPCに組み込むにはだいぶ敷居が高いのだが。 Kazuo Moriwaka said... intelのivy bridge世代には高速な乱数生成器がはいるみたいですよ。entropy sourceが目からうろこでした
たとえば SSH や PGP の鍵対を生成するときには、本当の乱数が必要になる。疑似乱数ではダメだ。Unix 上で乱数を生成してくれるデバイスとしては、/dev/ramdom がある。/dev/ramdom には、真性乱数が蓄えられていて、read システムコールで必要なバイト数だけ読み込むことができる。 /dev/ramdom が真性乱数を生成する方法は、実に単純だ。ハードウェア割り込みの間隔を測るのである。今の間隔が直前の間隔よりも短ければ 1 を、長ければ 0 を真性乱数として蓄える(0 と 1 の割り当ては逆かもしれない)。つまり割り込みが、時刻 t1、t2、t3 に起こったとすると、t2 - t1 と t3 - t2 を比較するということだ。 /dev/ramdom は、ブロックデバイスなので、必要な量の真性乱数がなければ、read システムコールはブロックする。このブロックをで
Perlの乱数についてIRCで盛り上がったのでまとめておく。 結論からいうと、srand()はPerl5組み込みのものでよい。乱数の生成はMath::Random::MTがよいとおもう。 Perlのrand()の実装はConfigure時に選べるようだが*1、ふつうはdrand48()がつかわれる。これは下位ビットがまったくランダムでないことで知られるrand(3)よりはましだが、しょせん線形合同法なのでセッションIDなどを作るのには安全ではない。安全な乱数を作るためにtime()やSHA1を混ぜ込んだりするほうほうもよくつかわれるが、そのくらいならはじめからM::R::MTを使ったほうがいいとおもう。 なお、srand()はあれば/dev/urandomを読むので、自前でsrand(time)などとするのはよくない。また、最初にrand()を呼ぶときに自動的に呼ばれるので、ふつうは明示的
C言語標準ライブラリの乱数rand( )は質に問題があり、禁止している学会もある。 他にも乱数には様々なアルゴリズムがあるが、多くのものが問題を持っている。 最も多くの人に使われている乱数であろう Visual Basic の Rnd の質は最低である。 そもそも乱数とは 乱数とは、本来サイコロを振って出る目から得られるような数を意味する。 このような乱数は予測不能なものである。 しかし、計算機を使って乱数を発生させた場合、 次に出る数は完全に決まっているので、予測不能とはいえない。 そこで、計算機で作り出される乱数を疑似乱数(PRNG)と呼び区別することがある。 ここでは、特にことわらない限り乱数とは疑似乱数のことを指すとする。 計算機でソフト的に乱数を発生させることの最大のメリットは、 再現性があることである。 初期状態が同じであれば、発生する乱数も全く同じものが得られる。 このことは
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く