C++相談室 part144

■ このスレッドは過去ログ倉庫に格納されています
2019/07/22(月) 13:18:35.52ID:gptRHpgT
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part143
https://mevius.5ch.net/test/read.cgi/tech/1560574313/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1556142878/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)

----- テンプレ ここまで -----
2019/09/04(水) 23:41:17.68ID:3YkDCQ2q
>>762
頭がおかしい。
2019/09/04(水) 23:41:42.83ID:HOiCfRXh
better Cとか言ってる奴らが老害だってよくわかるね
2019/09/04(水) 23:57:17.61ID:twmgvXS9
Cで書いてもええけど

> ((float)rand()) * STR_MAX / RAND_MAX );

この乱数に対する意識の低さがくそ
2019/09/04(水) 23:58:00.42ID:8IyIvdim
rand()なんか使ってる時点で商用ソフト書かせちゃいけないセキュリティ意識皆無のカスだって自白してるようなもの
2019/09/05(木) 00:01:08.35ID:wSq6T90P
>>765
間違えてた。正しくはこうだと思う:
int  idx = (int)( ((double)rand()) * (STR_MAX - 1) / RAND_MAX );

まだ間違いがあるかも知れんが。
2019/09/05(木) 00:09:37.75ID:wSq6T90P
>>766
知らなかっただけで、std::uniform_int_distribution のような便利なライブラリが
あるんだったらそっちを使ったほうがいい。
本当は、古いCに昔から入っているような rand() はアルゴリズムが良くなくて
モンテカルロシミュレーションなどでは余り良い結果が出ない。
昔やってみて分かった。ネットに転がってたもっといいアルゴリズムの乱数に
変えてみたら結果が良くなった。
2019/09/05(木) 00:10:44.20ID:5Cw7Ao7f
今どきrand()が論外なのは別として剰余も知らんの?
2019/09/05(木) 00:12:59.23ID:5Cw7Ao7f
何だこいつ

> 新しい機能はC++委員会が好き勝手に追加しているだけで、
> 学ぶ意味が無い。



> 知らなかっただけで、std::uniform_int_distribution のような便利なライブラリが
> あるんだったらそっちを使ったほうがいい。
2019/09/05(木) 00:15:04.65ID:ymsvBiyv
>>769
rand()%Nは最悪のディストリビュータといわれている。
浮動小数でやるほうが幾分かましといわれる程度には。
2019/09/05(木) 00:16:17.70ID:wSq6T90P
>>769
剰余で
int idx = rand() % RAND_MAX;
のようにすると均等確率にはならないことがある。
俺の専門は数学に近いので分かる。
2019/09/05(木) 00:18:23.32ID:wSq6T90P
>>772
間違い修正:
誤:int idx = rand() % RAND_MAX;
正:int idx = rand() % STR_MAX;

このように書いた場合、直感では、RAND_MAXがSTR_MAXの倍数で無い場合
に均等確率にならないハズ。
2019/09/05(木) 00:18:43.26ID:M7+W0IyT
低劣なrand()のさらに劣悪な下位ビットを使うくらいならアホが書いてる形の方がまだましではある
rand()みたいな小学生でも推測できる危険極まりないゴミクズを使ってる時点で目くそ鼻くそだけど
2019/09/05(木) 00:21:02.57ID:wSq6T90P
>>771
おっしゃるとおり、そのやり方だと、
N が rand()の最大値 RAND_MAX の約数で無い場合には、均等確率になりませんね。
2019/09/05(木) 00:21:37.88ID:5Cw7Ao7f
Nが2の累乗でない限り%Nは上位ビットも影響するけど
2019/09/05(木) 00:22:46.70ID:wSq6T90P
>>774
質問者は、>>747 と書いただけなので、初心者的質問だとみなして
そんなに高度な乱数は必要ないと思ったので書いてみただけ。
2019/09/05(木) 00:25:08.12ID:M7+W0IyT
初心者にこそrand()みたいな絶対に使ってはいけない危険物を紹介したらダメだろうが
お前は初心者が入力読み込みの質問したらgets()を教えるのか?
2019/09/05(木) 00:25:11.59ID:wSq6T90P
>>774
>低劣なrand()のさらに劣悪な下位ビットを使うくらいならアホが書いてる形の方がまだましではある
あなたは、% と & を間違えてませんか。

x % y : x を y で整数除算したときの余り。
x & y : x と y の BIT 積 (and)。
2019/09/05(木) 00:25:49.83ID:wSq6T90P
>>778
rand()のどこが危険なのですか?
2019/09/05(木) 00:27:59.92ID:6cA0wVT5
てか、今時まだ下位ビットに周期性あるのかね?
2019/09/05(木) 00:30:09.80ID:ymsvBiyv
std::minstd_rand は 線形合同法デス。



おわかりいただけただろうか。
mt19937最強!
2019/09/05(木) 00:32:23.63ID:M7+W0IyT
>>780
劣悪だからっつってんだろ
あんなもの数個連続で観測されただけで簡単に予想できる
うっかりセッションIDやら初期パスワードやらの生成に使おうもんなら簡単に7pay案件だ
あんたそんな事も知らないでプログラマーやってんの?

>>781
rand()は昔も今もこれからも線形合同法のゴミだから今どきもクソもない
2019/09/05(木) 00:33:07.37ID:wSq6T90P
>>781
rand()が 閉区間 [0, RND_MAX] の整数値を均等確率で出力する場合に、
idx = rand() % STR_MAX;
とすると、STR_MAX が RND_MAX の約数で無い場合は端数のような部分が
同じ場所に集中して出現したり、抜けが起きたりして、idx は
[0, STR_MAX] の区間の整数値を均等確率で生じさせません。
785デフォルトの名無しさん
垢版 |
2019/09/05(木) 00:35:35.65ID:wSq6T90P
>>783
>劣悪だからっつってんだろ
>あんなもの数個連続で観測されただけで簡単に予想できる
>うっかりセッションIDやら初期パスワードやらの生成に使おうもんなら簡単に7pay案件だ
>あんたそんな事も知らないでプログラマーやってんの?

自分の専門は自然科学系で、シミュレーションで使うことはありますが、
パスワード系で使うことは一度も想定したことが有りませんでした。
2019/09/05(木) 00:36:33.70ID:wSq6T90P
>>784
誤:[0, STR_MAX] の区間の整数値を均等確率で生じさせません。
正:[0, STR_MAX - 1] の区間の整数値を均等確率で生じさせません。
2019/09/05(木) 00:38:32.53ID:M7+W0IyT
自然科学だとしてもあんな偏りまくりのクソ使っちゃダメだろ…
まさかとは思うが2連続で呼んで座標値作ったりしてないだろうな
もしやってたらそのシミュレーション全部カスだから作り直してやり直せ
2019/09/05(木) 00:39:51.44ID:ymsvBiyv
https://cpprefjp.github.io/reference
https://cpprefjp.github.io/reference/random.html
このサイト良いよ。ランダム見たら驚くよ。
自然科学なら分布の偏りから正規分布まであるのは天国のような気がするな。
2019/09/05(木) 00:42:23.49ID:wSq6T90P
>>787
実際、rand()を使ってモンテカルロ法をやってみたところ予想通りには行かなくて
かなりはまったことが有ります。その後、確か xor256 法などを使ってだいぶ
ましになりました。
2019/09/05(木) 00:45:37.20ID:wSq6T90P
>>788
さっきの例に出ていたキーワードで検索してさっき見てました。

なお、確率の均等性だけでなく、前後の相関が低いという意味において、
rand() より xor256 法は優れているようです。
2019/09/05(木) 00:47:57.94ID:ymsvBiyv
モンテカルロやるんだったら、メルセンヌツイスタはグレートな動きするよ。
623次元均等分布とかいうよくわからんものだ。かなりクレイジー。
mt19937がそれだ。
2019/09/05(木) 00:51:22.71ID:wSq6T90P
みなさん、最初の質問は >>747 というとても素朴なものであったのを
分かっておっしゃってますか?
2019/09/05(木) 00:56:19.52ID:Gf88bG6s
それはもう答え出てるから
2019/09/05(木) 01:13:48.78ID:ymsvBiyv
>>792
https://ideone.com/hOJlOU
これがオチということで・・・・。
2019/09/05(木) 01:16:30.46ID:ymsvBiyv
お題: >>794ではvectorを返却値にしているが、これは何バイトコピーしていると考えられるか?

暇だったら考えてみて。
2019/09/05(木) 01:26:21.35ID:lN+O1qau
乱数って/dev/randomから取ってもいいんでしょ?
なんか今システムコールもあるみたいだけど
2019/09/05(木) 01:28:10.60ID:ymsvBiyv
>>796
うにっくす限定なので標準ライブラリを使ったほうがポータブルですよ。
まぁ、C++98とか使ってるならわからんでもない。
2019/09/05(木) 01:49:34.32ID:lN+O1qau
シミュレーションなら当然疑似乱数だけども
暗号用とか一発モノ
2019/09/05(木) 01:51:14.01ID:ymsvBiyv
>>798
逆にメルセンヌツイスタでは秘匿情報を暗号化するのは絶対やめてくれといわれている。
詳しくはWikipedia読んでね。
2019/09/05(木) 01:56:58.36ID:lN+O1qau
明智抄の漫画持ってるくらいだからまあ理屈はわかっとると思うよ
2019/09/05(木) 02:08:50.93ID:xr5VBkHA
>>747です。たくさんアドバイスありがとうございます
2019/09/05(木) 07:20:55.17ID:Scz25acM
C++のrandomすごい便利なんだけどstd::random_deviceが固定の乱数列しか返さない環境があることが問題だ。

https://cpprefjp.github.io/reference/random/random_device.html
2019/09/05(木) 07:22:17.46ID:TZCSkvxf
パスワード生成とかシミュレーションとかマウント取りたくてしかたない老害だらけだなw
>>747はじゃんけんゲームだろ?
2019/09/05(木) 07:25:46.47ID:OtMARD1h
>>802
それマジクソだよな
エントロピー源が作れないなら作れないと例外でも投げろっての
黙ってインチキするなんて最低だ
2019/09/05(木) 08:22:51.14ID:4woSX2Eo
線形合同法って下1ビット捨てればだいたい解決するんじゃね?やったことないからわからないけど
2019/09/05(木) 08:26:22.54ID:cQUMBPrz
メモリポンタ最強
2019/09/05(木) 08:34:47.23ID:04ZPpNlH
>>802
それ最近治ったらしい
2019/09/05(木) 09:01:35.03ID:Scz25acM
>>807

windowsのGCCじゃ無ければ問題ないだろうとiphoneのアプリで使ったら毎回同じ乱数列でな。
2019/09/05(木) 10:05:53.05ID:jPhMORz8
unixが何を制御してるか知らんが乱数のデバイスなんだからその先に原子炉の一つでも繋がってるんじゃねえの?
そっからの出力が乱数じゃなくなったらヤバいことになってる
2019/09/05(木) 10:07:27.15ID:wSq6T90P
>>809
もしかして原子炉ではなくて、量子乱数生成器のことですかね。
2019/09/05(木) 10:34:35.09ID:OtMARD1h
なんで乱数のデバイスに原子炉がいるんだよw
アバランシェでできるだろうが
2019/09/05(木) 11:52:48.46ID:A2EHupI7
乱数なんかでこんなに盛り上がってしまうのは
これはアレだね
2019/09/05(木) 13:03:17.93ID:of7w1ctN
仕事がもらえてない駄目なプログラマーの集まりってことだな!
2019/09/05(木) 15:11:59.85ID:Scz25acM
そもそも仕事してないからな!
2019/09/05(木) 15:48:17.02ID:VtA7IODN
ここは暇なインターネットですね…
2019/09/05(木) 16:05:03.33ID:OtMARD1h
ずーっと安定して生かさず殺さず飼われている社畜が
肉食獣の食事後のような優雅な暇を知らねえのはまあ道理だ
2019/09/05(木) 18:10:20.05ID:O7Dd9aK6
乱数の扱いをミスるとXBOXのカルドセプトみたいになるぞ
2019/09/05(木) 18:40:46.63ID:zNNFYG19
vc++ でも、linux でも使える、STLライブラリとして、ずっと、STLPORT使っているけど、
今は、どんな状況になっているんだろ?
2019/09/05(木) 18:43:11.27ID:ymsvBiyv
コンパイラのSTLでなんか不満あるんかいな。
今後は3年程度で新仕様はいるようになる予定だ。
2019/09/05(木) 18:47:06.02ID:04ZPpNlH
>>808
マジかよ、他にもいたのか・・・
cpprefjpに書いといたら?
2019/09/05(木) 19:12:25.60ID:ymsvBiyv
>>795
出題した者だが、自分の回答では、3変数程度のコピーで済む。
メモリへのポインタとキャパシティ変数と使用中を保持する変数。
64ビット変数だとして、24バイト程度と考えられる。俺には。
2019/09/05(木) 19:47:31.38ID:Scz25acM
>>820

該当アプリはsololearnやね。

実務で使うわけでも無いしcpprefjpに書くのは恐れ多い。
2019/09/05(木) 20:17:53.77ID:RTqjgiVl
>>779
% を使う、というのは「下位ビット」を使う、という意味と同じですよ
2019/09/05(木) 20:18:27.47ID:RTqjgiVl
>>780
rand() は線形合同法でインプリメントされているので、乱数の質はあまりよろしくないのです
2019/09/05(木) 20:58:58.28ID:XFJCfiEp
>>823>>824
うぜーなーそんなもん誰でも知ってる
2019/09/05(木) 21:59:37.41ID:04ZPpNlH
>>822
ああなるほど
あのアプリはどこかサーバーに送って実行してるというわけではないのね
それとも送った先がおかしいのか?
2019/09/05(木) 22:23:16.46ID:O7Dd9aK6
知らないジジイがいるから教えてるだけだぞ
2019/09/05(木) 22:55:03.42ID:dJChsmUT
>>823
それは違う。
2019/09/05(木) 22:55:52.34ID:dJChsmUT
% と & の違いが理解できないとは・・・。
2019/09/05(木) 23:11:16.46ID:dJChsmUT
だれが rand() が危険と教えてるんだろう。
これが日本の教育か。嘆かわしい。
2019/09/05(木) 23:13:15.63ID:emUna+dk
とりあえず
rand 危険性 下位ビット
辺りで検索して出直してこい
2019/09/05(木) 23:13:29.08ID:dJChsmUT
このスレは、自分が馬鹿だと気づいてない人が多いのが問題。
2019/09/05(木) 23:14:54.43ID:dJChsmUT
質の悪い乱数 ≠ 危険

であることも理解できないとは。
2019/09/05(木) 23:16:21.31ID:dJChsmUT
頭の悪い人は、自分が頭が悪い事に気付かない。
それが最大の問題なんだ。
だから学歴フィルターで落とす。
2019/09/05(木) 23:22:15.18ID:3AoluiiY
馬鹿だから自分の判断よりも学歴で判断することになる。
あんなもんは足切り以外役に立たん。
2019/09/05(木) 23:22:53.94ID:dJChsmUT
馬鹿は馬鹿だと気付かないからな。
学歴フィルターがあるんだ。
2019/09/05(木) 23:24:12.84ID:oF7lOGXi
悪い乱数をセキュリティ関係に使うとまずい
2019/09/05(木) 23:24:14.66ID:dJChsmUT
& と% の違いもいくら言っても理解できないんだろ。
rand() の質が悪い事を危険と思っていたりとかな。
2019/09/05(木) 23:25:02.42ID:dJChsmUT
>>837
それはお前だろ。
今回の質問は、セキュリティー関係ないだろ。
2019/09/05(木) 23:30:31.24ID:mvC8Xt02
mtだってセキュリティ目的で使うべきではないが他に分野では一般的に用いられる優秀な乱数
要件次第で何が良いかは変わる
randは対応できる要件が少なくて大抵の場合xorやmtが上位互換になれる
メモリ周りがキツい環境下ならmtは候補から外れることもある
2019/09/05(木) 23:32:50.72ID:oF7lOGXi
一般に、ビット毎のANDと、剰余(余り)は別の演算だが、最適化によっては剰余がANDになることがある。
2019/09/05(木) 23:36:21.38ID:HDKa127r
>>841
そんなもの誰でも知ってる。
and と mod は別の概念だ。
2019/09/05(木) 23:36:48.12ID:Wj2GuKre
なんで最適化が出てくるよ?除数が2の冪かどうかだけだろ。
2019/09/05(木) 23:52:27.70ID:oF7lOGXi
昔は%が物凄く遅かった。
2019/09/05(木) 23:59:42.92ID:HDKa127r
>>844
それはそうだね。
2019/09/06(金) 00:45:20.09ID:kzddYIGk
つか、事あることにセキュリティって言ってるけど、厳選された乱数を使うような、シビアなセキュリティのプログラム作るような人がここにいるの?
2019/09/06(金) 00:54:30.17ID:9umjXXHu
a=b*2^n だった場合、
rand() % a の下位 n ビットには元の rand() の下位 n ビットがそのまま現れる。
2の累乗だけでなく、2の累乗を約数とする場合も下位ビットの影響が大きい。
2019/09/06(金) 00:56:43.20ID:AgDBiA/M
パスワード管理とか通信ソフトとかオンラインゲームとか。数える位は居るだろうよ。
2019/09/06(金) 00:58:53.52ID:ZIHlUiP/
>>826
試しにwebのsololearnでも試してみたとろmt19937のデフォルトと同じ乱数列を生成したのでcpprefjpに書いてあるWindowsのGCCと同じ挙動だな。
2019/09/06(金) 01:27:15.87ID:TfAw/avA
定義の前にvirtual付ければ仮想関数になるのは分かるんだけど、動的接続の意味がちょっと分からない
2019/09/06(金) 01:28:44.78ID:cs8CUE0i
>>849
実行環境Mingwとは思えないので他にも同じことしてる実装があるんか
それとも独自実装なのか、まさか
2019/09/06(金) 01:48:27.80ID:cs8CUE0i
>>851
定義済みマクロで調べてみたら実行環境Mingwぽい・・・・
2019/09/06(金) 01:55:47.74ID:cs8CUE0i
sololearnの実行環境、Mingw GCC 7.2.0らしい
Mingw GCCのrandom_deviceが治ったのは9.2から・・・
2019/09/06(金) 07:14:39.55ID:ZIHlUiP/
>>853

char_traitsのlengthがconstexpr対応してないのもあるよ。
その為にstring_viewがconstexprに出来ない。
855デフォルトの名無しさん
垢版 |
2019/09/06(金) 08:33:08.03ID:5s+Nj0ya
constexpr を#if 〜 #endif マクロ で使えるようにできないですか?
2019/09/06(金) 08:36:49.45ID:Ai9IWLM5
それは根本的におかしい
2019/09/06(金) 10:01:31.79ID:7h7MjjwN
>>817
>>805
2019/09/06(金) 10:02:35.89ID:7h7MjjwN
>>847
それはお前の選び方が悪い
2019/09/06(金) 12:35:45.50ID:NkLDDTp5
rand使うときはまずMAXで割ってから、欲しい範囲をかけて使ってね
2019/09/06(金) 17:17:41.26ID:h7oJ0UUz
g++ -mtune=ivybridge -O3 -S
こうやってもrdrand命令使ってくれないな
2019/09/06(金) 20:30:19.25ID:mhFSZpwS
どうやったら使うの
2019/09/06(金) 20:43:09.72ID:cs8CUE0i
たぶんだけど、rdrand単体は信頼度が低いから必ずシステムの乱数源から取得するようにしてるんだと思う
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況