実装だけなら適当なサイトのコピペで終わるので、 ソース例を見せながらご説明しますね。ソースは文末です。 今回はXorshiftで行いました。 基本的な情報系の知識はあるものとして、中級レベルから解説します。 まず、xor128(void)についてです。 なぜこの関数が乱数を発生させられるのか? 固定値しか帰ってこなさそうなのに。 通常、関数内で値を変更しても抜けたら無効となります。 しかし、static宣言することで、次回も保存しておけます。 この仕組みと、32bit符号無し整数、 シフト演算、排他的論理和の組み合わせで、 要は"適当な計算"をしてるのです。 ※ 本当に適当だと永久的かつランダムな乱数は発生しません。 本当は厳密に計算されて論文で裏づけされてます。 ここは論文レベルになるので、興味があれば調べてください。 以上の関数により、32bitの乱数が返ってきます。 次に、1~14の
2016-11-19[土] C++TemplateのつもりでC#Generics使ってハマる(初歩) 人様のソース改修でロクに知らないC#をここ1,2ヶ月さわってた。 といってもそのソースもC#慣れしたわけでないC系ユーザーが書いたような感じで ある意味助かったのだけれど、コピペ膨れなソースだったので、処理をまとめようと C++Template 的に Generics を使おうとして...ちょっとハマった。 C++だと #include <stdio.h> class Foo { public: void Run() { printf("Foo!"); } }; template<class T> class FooMgr { public: void Run() { T().Run(); } }; class Bar : public Foo { public: void Run() {
2008-09-07 擬似乱数とは 擬似乱数とは、プログラムにより生成する「乱数っぽく見える数」のことだ。 本物の乱数(自然乱数)とは完全に予測不能な数のことで、 これは厳密に言えば、プログラムでは絶対に生成することはできない。 (自然乱数を得る手段としては、回路の熱雑音などの物理現象を利用する方法などがある。) 擬似乱数は計算(多くの場合は漸化式)によって作るため、 計算の初期値がわかれば予測が可能である。 予測可能であることは乱数の性質に反するが、シミュレーションを行う場合などには都合がよい。 またゲームでも、ランダムに弾が発射されるようなシューティングゲームのリプレイを再生する場合などに、 乱数を再現する必要性が出てくる。 擬似乱数を生成する方法は様々なものが考えられている。主な方法の名称を以下に示す。 この記事でとりあえず言いたいことは、XorShiftが手ごろでいいね!ということ
Xorshiftは疑似乱数列生成法の1つである。George Marsaglia(w:George Marsaglia)が2003年に提案した。演算が排他的論理和とビットシフトのみであるため高速である[1] などの特徴がある。 #include <stdint.h> struct xorshift32_state { uint32_t a; }; /* The state word must be initialized to non-zero */ uint32_t xorshift32(struct xorshift32_state *state) { /* Algorithm "xor" from p. 4 of Marsaglia, "Xorshift RNGs" */ uint32_t x = state->a; x ^= x << 13; x ^= x >> 17; x ^=
Example random distribution of Xorshift128 Xorshift random number generators, also called shift-register generators, are a class of pseudorandom number generators that were invented by George Marsaglia.[1] They are a subset of linear-feedback shift registers (LFSRs) which allow a particularly efficient implementation in software without the excessive use of sparse polynomials.[2] They generate the
簡単なモンテカルロシミュレーション編 半径1の円の面積を求めるモンテカルロ 一辺が2の長さを持っている正方形をまず考えます。 縦横方向にx,y座標を置き、各辺の中点を、それぞれx,y軸に交わるようにします。 こうすると、半径1の円を正方形に入れると、その中心が(0,0)に来ます。 今、-1〜+1の範囲で二つの乱数が振られた時(正方形の中の一点をランダムに指定した時)、その2乗和が1以下になったなら、これは円に入ったと言えます。 何度かこれを試行して、円に入った割合に正方形の面積(2×2=4)を、この割合にかけると、円の面積が求められるでしょう。というもの。 #include<stdio.h> #include<stdlib.h> #include<time.h> int main() { double i,k,n,r,x,y,c1,c2,C1,C2; n = 10000000
質問の意味は、次の3行を云いたいのでしょうか? rand関数を使った式の意味が分かりません。式は 最小値 +(int)( rand() * (最大値 - 最小値 + 1.0) / (1.0 + RAND_MAX) ) ① です。この式は何を求めようとしているのでしょうか。よろしくお願いします。 この質問だったら、回答は以下の通りです。 式は次の形と等価です。 最小値 + (int)( (最大値-最小値 + 1.0) * (rand()/(1.0 + RAND_MAX)) ) ② これは、細かいことを抜きに表現すれば 係数 = (rand()/(RAND_MAX) 最小値 + (最大値-最小値) * 係数 ) ③ 係数が1ならこの値は 最小値 + (最大値-最小値) * 1 = 最大値 となり 0なら 最小値 + (最大値-最小値) * 0 = 最小値 となります。 RAND_MAX は r
Example of shuffling five letters using Durstenfeld's in-place version of the Fisher–Yates shuffle The Fisher–Yates shuffle is an algorithm for shuffling a finite sequence. The algorithm takes a list of all the elements of the sequence, and continually determines the next element in the shuffled sequence by randomly drawing an element from the list until no elements remain.[1] The algorithm produc
2010-06-03 カテゴリ: Client Side タグ: JavaScript Tips アルゴリズム 前回の記事で予告したとおり、今回はJavaScriptのMath.random()で生成できる乱数の精度の話。 前回の記事で、JavaScriptでは2^53未満の正整数を扱うことができるということがわかったから、今回の記事では2^53未満のランダムな正整数を生成してみる。 具体的には↓のようなコード。 var ub = Math.pow(2, 53), list = []; for (var i = 0; i < 16; i++) { list[i] = Math.floor(Math.random() * ub).toString(2); while (list[i].length < 53) { list[i] = "0" + list[i]; } // padding }
というわけで、第6回アルゴリズム勉強会に初めて参加してきました。アルゴリズム勉強会 : ATND 場所は六本木黒崎ビルの株式会社Speeeさんの会議室。以前GREEが入っていた(今はアリエルネットワークになっている)フロアの下らしいです。勉強会の内容はアルゴリズムイントロダクションを順番に読んでいくもので、自分は原著の分厚いIntroduction to Algorithmsを持って行って参加しました。今回は第5章「確率的解析と乱択アルゴリズム」でした。確率が出てくるので、慣れていないと躓きやすい&実装があまり出てこないので、飽きやすい部分です。自分も一年くらい前に12章まで読んだときは飛ばしてしまいました。なお、この本は版によって内容と構成が大きく違うので、旧版をお持ちの方はご注意ください。雰囲気としては、発表なしの輪読会なので本文を朗読したり黙々と練習問題をこなしたりホワイトボードで解
表題の件について。 地味な話ですが、javascript(というかECMAの仕様)にあるMath.random()には、乱数のシードを与える方法が無いようです。 そんなわけで、われわれ一般市民は各ブラウザが独自に実装している、謎のシードで初期化された謎のアルゴリズムで作られた乱数を通常使うわけですが。 Mozillaからこんなの出てた。 曰く、Math.random()のシードによる初期化は、ブラウジングセッションごとに1度しか行われないと。 で、シードはまあ、かぶる率そんなに高くなさそうなので、そのシードをUSERの(擬似的な)ID代わりにしてしまえば、ユーザーのトラッキングができるよーん、とのこと。 はじめ読んだとき、「おおー、かっけー!」と思ったんですが、ちょっと待て。 シードって外から取れんのか。 というわけで、色々調べたところ、各ブラウザは(多分IEも)線形合同法による擬似乱数を
はてなグループの終了日を2020年1月31日(金)に決定しました 以下のエントリの通り、今年末を目処にはてなグループを終了予定である旨をお知らせしておりました。 2019年末を目処に、はてなグループの提供を終了する予定です - はてなグループ日記 このたび、正式に終了日を決定いたしましたので、以下の通りご確認ください。 終了日: 2020年1月31日(金) エクスポート希望申請期限:2020年1月31日(金) 終了日以降は、はてなグループの閲覧および投稿は行えません。日記のエクスポートが必要な方は以下の記事にしたがって手続きをしてください。 はてなグループに投稿された日記データのエクスポートについて - はてなグループ日記 ご利用のみなさまにはご迷惑をおかけいたしますが、どうぞよろしくお願いいたします。 2020-06-25 追記 はてなグループ日記のエクスポートデータは2020年2月28
OR学会50年の歴史の中で,OR事典の編纂・改訂は通算3度目となる.いろいろな理由からOR事典編集委員会は,「OR事典」をWebに公開するという手段をとることになった.前回はCDによる出版であった. 資料編だけは「OR事典」から切り離して,OR学会の通常のホームページの中に移すことになった.これは逆瀬川浩孝委員長のアイディアである。内容の性格上,資料追加も間違いの訂正も広報委員会の責任で簡単に出来るようになる. 前回までの学会の歴史資料はそのまま残してある.今回はデータ追加作業を基本に多少の資料追加を行った.前事務局長の藤木秀夫さんには,その後の学会活動全般にわたる記録をまとめて原稿を作成してもらった.学術会議関係も藤木さんが前回の形式に習って資料原稿を作成し,FMES会長の高橋幸雄さんに目を通していただいた. 各支部から増補追加の原稿が送られてきた.Webのサンプルを見てくださいと言って
ゲーム作家・ゲーム研究者遠藤雅伸のブログです。 ゲームに関する話題を、ビジネス、アカデミック両面からも取り上げます。 ゲームデザインにおいて初心者の陥りやすい問題の1つとして、確率に対する誤った考え方があります。 -------------------------------------------------- 課題:RPGで、ある敵を倒したら稀にアイテムが手に入る。このアイテム、敵を100匹ほど倒したら少なくとも1回くらいは出て欲しいのだが、さてどのような設定にすればいいか? -------------------------------------------------- 最も安易な考え方が、「100回に1回起きればいいことなんだから、1/100の確率でアイテム出せばいいんじゃね?」というもの。これと同じ考え方をした人に向けて、このエントリーは書かれていますので「簡単な余事象の問題
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く