フォーラム

Mac Xcode C ++ヘルプ!実数乱数ジェネレータ

unknown.exe

オリジナルポスター
2007年9月22日
地球上のどこか
  • 2007年12月13日
つまり、単一のセルのDNAがどのように見えるかを複製するために、DNAの4つのコンポーネント(A、G、T、およびC)をランダムな順序で1,000,000回出力するC ++プログラムを作成しています。これが私のコードです:

{{
//痛風
痛風:
int randnum;
for(long double i = 1.0; i<1000000.0; i++)
{{
srand((unsigned)time(0));
for(int index = 0; index<1; index++)
randnum =(rand()%1000)+1;
if(randnum<=250)
費用<< 'A';
else if(randnum> 250 && randnum<= 500)
費用<< 'C';
else if(randnum> 500 && randnum<=750)
費用<< 'T';
そうしないと
費用<< 'G';
}
}

正常にコンパイルされますが、出力は次のようになります。

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCGGGGGGGGGGGGGGGGGGGGGGGGGGGG
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
GGGGGGGGGGGGGGGGGGGTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ..........................など

明らかに、乱数ジェネレーターは非常に... uuuuhhh ...ランダムではありませんか?さて、誰かが非常に乱数ジェネレーターを知っているか、これを達成するためにコードを変更できる方法を知っているなら、教えてください!

gnasher729

一時停止
2005年11月25日


  • 2007年12月13日
srand()への呼び出しの何が問題になっていますか?

クリスブライトウェル

2004年4月5日
アラバマ州ハンツビル
  • 2007年12月13日
srand()の呼び出しを外観の外に移動します。 RNGをシードする必要があるのは1回だけです。

ただし、問題は次のとおりです。そのループは数ミリ秒で数回実行されます。ループを通過するたびにRNGを再シードすると、個々のミリ秒の間に同じ値が数回取得されます。

unknown.exe

オリジナルポスター
2007年9月22日
地球上のどこか
  • 2007年12月13日
ChrisBrightwellは、次のように述べています。srand()の呼び出しを外観の外に移動します。 RNGをシードする必要があるのは1回だけです。

ただし、問題は次のとおりです。そのループは数ミリ秒で数回実行されます。ループを通過するたびにRNGを再シードすると、個々のミリ秒の間に同じ値が数回取得されます。

「外見」とはどういう意味ですか...ループを意味しますか?

unknown.exe

オリジナルポスター
2007年9月22日
地球上のどこか
  • 2007年12月13日
srand()をループの外に移動するとうまくいきました!どうもありがとう!

ShosMeister

2007年12月28日
  • 2007年12月30日
Webで検索すると、本当に必要な場合に真の乱数を提供するオンラインソースがいくつか見つかります。それらのいくつかは無料(ログインアカウントを作成する必要があるだけです)であり、他は有料です。独自のハードウェア乱数ジェネレーターを作成する方法を示すものもいくつかあります。

私が行ったすべての調査の要点は、ハードウェア入力(オンラインソースに示されているビデオ、サウンドなど)を使用しないと真の乱数を生成できないことです。 PokerStarsでさえ、特定のテーブルに座っているユーザーのマウスアクティビティを含め、入手できるすべてのものを使用して、ハードウェアベースの乱数システムに移行しました。

お分かりのように(多分)これは、私が真の(非アルゴリズムとして読む)乱数ジェネレーターである私のAtari 800を使用した最初のコンピューター以来、何年にもわたって私にとって非常に興味深いトピックです。クロック周波数の下位4桁または5桁を使用していました(本を確実に確認する必要がありますが、これは近いです)。次に、それをプログラムに送り返し、0から1の間の数値になるように左シフトしました。

私が何年にもわたって試みてきたことはこれを複製することですが、最近のほとんどのコンピューター(利用可能な言語を使用)はこのデータにアクセスできないようです。そこで、最高の解像度(nanoTimeなど)のアクセス可能なタイマーを使用して独自のタイマーを作成しました。それを適切にシフトすると、かなり印象的な真の乱数を得ることができます。私はそれを10000回実行し、組み込みのrand関数を10000回実行して統計結果を比較しましたが、それらは比較的同じでした。

私が持っていたもう1つの考えは、ネットワークまたはハードドライブのアクティビティを調べて、乱数をキャプチャするために使用できるものがあるかどうかを確認することでした。また、乱数を組み合わせて使用​​し、(乱数に基づいて)どこかのメモリに移動し、その場所(または画面のビット/バイト)からデータを取得します。

真の乱数が本当に必要な場合に備えて、いくつか考えてみてください。

ゲルフィン

2001年9月18日
コロラド州デンバー
  • 2007年12月30日
unknown.exeによると:私は、単一のセルのDNAがどのように見えるかを複製するために、DNAの4つのコンポーネント(A、G、T、およびC)をランダムな順序で1,000,000回出力するC ++プログラムを作成しています。

ChrisBrightwellが説明したように、randを繰り返し再シードして誤用していますが、これは一般的にPRNGの非常に悪い例であり、使用する習慣をつけないことをお勧めします。

利用できるより良い選択肢が2つあります。移植性(たとえば、Windowsへの)が心配な場合は、「rand」ではなく「random」のドキュメントを参照してください。 Mac(および他の特定のUnix)に固執している場合は、単に/ dev / randomからバイトを開いて読み取ることを検討してください。システムは/ dev / random用に独自のエントロピープールを維持しているため、通常はシードする必要はなく、深刻な暗号化以外の場合は十分にランダムです。

余談ですが、単に印刷物でDNAっぽさの漠然とした印象を与えることを目的としているのでない限り、100万塩基のランダムな品揃えが強調されています いいえ 単一の細胞のDNAはどのように見えるか。

ShosMeister氏は次のように述べています。お分かりのように、これは、真の(非アルゴリズムとして読み取られる)乱数ジェネレーターである私のAtari 800を使用した最初のコンピューター以来、長年にわたって私が非常に興味を持ってきたトピックです。それがしたことは、クロック周波数の下の4桁または5桁を使用することでした(本を完全に確実にする必要がありますが、これは近いです)。次に、それをプログラムに送り返し、0から1の間の数値になるように左シフトしました。

私が何年にもわたって試みてきたことはこれを複製することですが、最近のほとんどのコンピューター(利用可能な言語を使用)はこのデータにアクセスできないようです。そこで、最高の解像度(nanoTimeなど)のアクセス可能なタイマーを使用して独自のタイマーを作成しました。それを適切にシフトすると、かなり印象的な真の乱数を得ることができます。私はそれを10000回実行し、組み込みのrand関数を10000回実行して統計結果を比較しましたが、それらは比較的同じでした。

高解像度タイマーはMacOS Xですぐに利用できます。mach_absolute_time()をインクルードして呼び出し、64ビットのCPUクロック値を取得します。他のプラットフォームにも、同じことを達成するための同様の手段があります。

そうは言っても、これについて少し考えてみてください。これほど安価に優れたランダム性を得ることができれば、なぜ誰かがアルゴリズムによるPRNGを発明したのでしょうか。ある種の分析では分布は似ているように見えるかもしれませんが、ランダムとはほど遠いものです。 NS

クリスA。

2006年1月5日
カリフォルニア州レドンドビーチ
  • 2007年12月30日
ShosMeisterは言った:あなたが言うことができるように(多分)これは私が持っていた最初のコンピューター以来何年にもわたって私にとって非常に興味のあるトピックです

Knuth Volume 2の「SeminumericalAlgorithms」を読んだことがありますか?Knuthは、私たちのほとんどにとって、これに関する最も信頼のおける情報源です。トピックの1つは、生成された数値の統計です。それらは範囲全体に本当に均一に分布していますか?配布は、ほとんどのアドホック手法の通常の問題です。

kpua

2006年7月25日
  • 2007年12月31日
また、結果をモッディングする場合、rand()は適切な選択ではありません。より適切なrandom()関数のマニュアルページによると、rand()関数の下位ビットは循環パターンになり、適切なランダム結果が排除されます。 random()は、連続する各数値の各ビットがランダム化されていることを確認します。 / dev / randomを使用することも良い提案でしたが、random()は一般的に、よりアクセスしやすく、実用的で、移植性があります。

イレイザーヘッド

2005年11月3日
イギリス
  • 2007年12月31日
man randomによると、arc4randomは、暗号強度の乱数を提供します(詳細については、man arc4randomを参照してください)。

ShosMeister

2007年12月28日
  • 2007年12月31日
ゲルフィンは言った:そうは言っても、これについて少し考えてみてください。これほど安価に優れたランダム性を得ることができれば、なぜ誰かがアルゴリズムによるPRNGを発明したのでしょうか。ある種の分析では分布は似ているように見えるかもしれませんが、ランダムとはほど遠いものです。

私は何年もの間、私が思いつくことができる唯一の理由は、時間が経つにつれて、人々は疑似乱数以外のものは必要ないことに気づいたということだと思っていました。また、多くの人は、最も単純な解決策がしばしば最良であることを忘れています。

私の個人的な感想は、ハードウェアが過去15年以上にわたって非常に急速に変化したため、プログラマーが追いつくことが不可能であったということです。彼らはすべての時間をハードウェアと歩調を合わせるためだけに費やしており、1980年代に存在したような真のイノベーションのための時間はあまりありません。私の意見です。

ゲルフィン

2001年9月18日
コロラド州デンバー
  • 2008年1月1日
ShosMeister氏は次のように述べています。私は何年もの間、私が思いつくことができる唯一の理由は、時間が経つにつれて、疑似乱数以外のものは必要ないことに人々が気付いたということです。また、多くの人は、最も単純な解決策がしばしば最良であることを忘れています。

それは良い話ですが、それはただ洗わないだけです。 Atari 800ソリューションに対するあなたの信頼は、ここではほとんど迷信的です。私はそれが誤った方向に進んでいることをあなたに伝えようとしています、そしてそれは本当に貧弱な解決策を複製しようとするあなたの時間の良い投資ではありません。

暗号化に十分なアルゴリズムPRNGは、クロックカウンターの上位ビットをマスクする場合と比較して、計算コストが非常に高くなります。私が以前に修辞的に尋ねたことは、今では肯定的に述べています。時計のカウンターを覗くだけで、これほど素晴らしい高価なものを作成した人は誰もいないでしょう。問題は、時計のカウンターを覗くということです しません ゲームに必要な弱くセミランダムな動作以上のものを期待している場合は十分です。アタリが狙っていたのはそれだけです。

私の個人的な感想は、ハードウェアが過去15年以上にわたって非常に急速に変化したため、プログラマーが追いつくことが不可能であったということです。彼らはすべての時間をハードウェアと歩調を合わせるためだけに費やしており、1980年代に存在したような真のイノベーションのための時間はあまりありません。私の意見です。

わお。これは、「代替医療」の信者に耳を傾ける医師であることがどのように感じられるかであるに違いありません。コンピュータ業界がどのように機能するかについてのあなたの考えは控えめに言っても興味深いものです。

ほら、私は男の最初のコンピューターを軽蔑するのは嫌いですが、POKEYチップには魔法はありません。デザイン全体は、14の手描きの回路図ページにあります。それに関する特許は10年近く失効しています。必要なトランジスタは、ゼロの実効コストで最新のCPUに追加できます。そして、彼らがやりがいのあることをしたとしたら、彼らはそうなるでしょう。 POKEYサウンドジェネレータがサウンドを再生するタスクに適しているのとほぼ同じように、POKEYRNGはそのタスクに適しています。 1979年に利用可能な最も安価な方法で、ランダムに見える動作をゲーム機に取り入れました。明確に定義された状態に初期化されます。これはカウンターベースであるため、頻繁に呼び出すほど、カジュアルなオブザーバーにとっても予測可能になりますが、断固とした攻撃者は時計を数え、操作の任意の時点で得られる値を正確に知ることができます。

あなたが持っているものは「真の」乱数発生器ではありません。あなたが持っているのは疑似乱数発生器なので、それは同じ種類の動物ではないと思うほど些細なことです。

最新のPRNGでは、アルゴリズムには任意の値がシードされます。多くの場合、プログラマーは現在の時刻をシードとして使用しますが、これは必須ではありません。 POKEY PRNGでは、「シード」は、チップが初期化されるときにレジスタにロードされる固定値です。

POKEYの「アルゴリズム」は(random =(seed + clocks_elapsed)&0xff)です。調査するアルゴリズムが実際にはなく、ハードウェアに実装されているため、アルゴリズムではないように思われます。対照的に、最新のPRNGは、そもそも強力な暗号化に基づいているのが一般的です。指定したシードは、内部バッファーの暗号化に使用されるキーを導出するために使用されます。この暗号化されたバッファーからランダムなバイトが読み取られ、バッファー内のすべてのバイトがコンシューマーに戻されたら、バッファーを再度暗号化するだけで、さらに多くのバイトを取得できます。したがって、RNGの強度は、暗号化アルゴリズムの強度に直接関係しています。

結論として、「実際の」ランダムはコンピューターが行うことの反対であり、それを説得力を持って偽造することは見た目よりも困難です。 POKEY RNGは、現代の隠れ家的な低木が忘れていた、ロマンチックなシリコンフロンティアの知恵ではありません。 POKEYを非常に簡単にエミュレートできます。それは良い考えではありません。

ShosMeister

2007年12月28日
  • 2008年1月6日
私は少し同意しませんが、これらすべてにあなたをとても怒らせて申し訳ありません。私たち(人間として)が常に最も簡単な解決策を見つけるとは思いません。多くの場合、私たちはうまく機能し、うまく機能するソリューションを見つけますが、それが常に最良/最も単純/最も簡単/最も効率的であるとは限りません。とはいえ。

あなたがやろうとしているのが時計を見ることだけなら、あなたは正しいです。それはかなり予測可能です。私が間違っていなければ、彼らは時計自体を見ていませんでしたが、周波数は絶えず変化していて、少し予測が難しいです-ちょっと。繰り返しになりますが、おっしゃるように、これは1.8mHzで動作し、主にゲーム機であるマシンに最適です。しかし、それはその考えが愚かであることを意味するものではなく、最新のシステムの調査を保証するものでもありません。アルゴリズムの正確な予測可能性がなくても、利用可能なPRNGと同等にランダムな分布を提供するものである場合は、繰り返しになりますが、そうではありません。

私は医者ではありません(しかし、昨夜はホリデイ・イン・エキスプレスに泊まりました)。真剣に、私は70年代から80年代に存在した革新の量が今日よりもかなり多かったと信じています。ソフトウェアエンジニアは、ハードウェアエンジニアができないと言ったことを頻繁に設計およびプログラムしましたが、それでも実行されました。その革新のいくつかは、かつては単なるソフトウェアドライバーであった個別のグラフィックカードのようなものに今日つながります。まだ創造性と革新性がないというわけではありませんが、ハードウェアの急速な進歩により、今ではそれが少なくなっていると思います。

テレビを例にとってみましょう。それが存在する前に、誰かがアイデアを作成しなければなりませんでした。さて、それ以降の変更は素晴らしいものではない(私のHDが大好き)とは言えませんが、ある程度は、元のアイデアの単なる改善にすぎません。それは、オリジナルまたは変更のいずれかがそれほど印象的ではなく、ただ異なるという意味ではありません。

軽蔑は感じませんでしたが、そこには少し魔法がありました。そうでなければ、なぜビデオゲームなどを生み出すのを手伝ったのですか。別のグラフィックスコントローラーを提供することは非常にユニークなアイデアでした。最初または唯一のグラフィックスコントローラーであるとは言えず、人気が高まっただけです。そして20年後には、2GHzでしか動作しない32ビットCPUについて話します(おおよそ)。テクノロジーは常に変化し、向上します。それはそれの影響を否定するものではありません。最初のトランジスタ回路が設計されていなかったら、私たちはどこにいるでしょうか?それもラメですか?私はそうは思わない。

繰り返しますが、あなたの血圧を上げようとはしていません。