今、
配列を重複なく乱数で埋めるには - Qiita
http://qiita.com/yumetodo/items/48d77f5d554df84f66f7
C++で効率よく重複のない乱数列を生成する = Qiita
http://qiita.com/hmito/items/9f4bdc8442b6f6b3c7bc
の浮動小数点版を作ろうと思っています。
ここで、make_rand_array_select
(リンク先参照)のアルゴリズムで生成しようと思っています
cpp
1template<typename type> 2std::vector<type> make_rand_array_select(const size_t size, type rand_min, type rand_max) ;
- 生成個数(第1引数)と生成範囲(第2, 3引数)を見た時重複なく生成可能かを調べ、不可能な場合は例外を投げたい
- 生成範囲(rand_min, rand_max自身も含む)のすべての数が重複なく列挙されたvectorを作りたい
と思っています。
Twitterで質問を投げた際には
- std::nextafterで全部辿ってしまう(@ytomino)
- ゼロ近傍を跨いでいるとすごくいろいろ面倒ですが(あと端のほうも無限大とか変な奴がいる)、それを別にすればIEEE 754方式の浮動小数点型の中身は、基本的に整数として比較できるようにできてるのでそのようにして(@ksmakoto)
- https://gist.github.com/mskashi/bd59f51d934d3c7ed42cこんな感じでいけると思います。全てのdoubleに連番をふる感じ。ただし、+0と-0は同一視しています。列挙はそれこそnextafterですかね。(@mkashi)
などという意見を頂きましたが、正直Twitterはこういうのを聞くのに向かないな、と思いまとめました。(なにより私が混乱してきた)
環境等
- 浮動小数点型は
float
,double
, (long double
)のことを指す - 浮動小数点型の内部仕様はIEEE754に従う
(size_t)((int)(rand_max) - (int)(rand_min)) < size
sizeof(long double) == sizeof(uint64_t)
追記
浮動小数点表現での一定範囲内の全列挙…だと?! | okkyの日記 | スラド
にて、全列挙のコストの高さを突きつけられたので別のアルゴリズムを模索中です。
https://twitter.com/fjs_kyousosama/status/704681468535009281
@yumetodo ヒント1: 64bitのビット列を完全に出力させて、それをdouble形式として読み込み、分布を調べると 0.0近辺に集中していることが判る。「それはランダムな浮動小数点分布」として欲しい分布なのか?
自力で検証していないけど0.0付近に集中したらアカンなぁ・・・
完全に整数版で作ったbit列を浮動小数点に変換する方向に考えていたので。
区間を生成個数で分割して各区間ごとに乱数生成してvectorに放り込んでshuffleとかしなきゃいけないんだろうか
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/03 14:22
2016/03/03 17:45
2016/03/05 11:12
2016/03/08 04:24
2016/03/08 12:40
2016/03/08 13:58
2016/03/09 01:45 編集
2016/03/19 13:51