2009-05-04 7 views
5

私はC++で最もランダムな関数は何ですか?

#include<stdlib> 
#include<time> 
using namespace std; 
srand((unsigned)time(0)); 
int n=(rand()>>8)%4; 

が、他のランダムな機能がある、または他のどのような機能が乱数発生器として使用することができるものを使用しましたか?

編集:私は本当にこの質問をする特別な理由はありません。私はC++に他のランダム関数があるかどうかを知りたいと思っていました。

+4

質問をより明確にしてください。あなたは暗号的に安全(予測が難しい)または良い分布を意味しますか? – Zifre

答えて

14

ランド()とsrand関数()関数は、すべてのC++標準で指定されています。そして、それはあなた自身を書くことになれば、どのようなジョン・フォン・ノイマンが言ったのことに注意してください。「乱数を生成する算術 方法を考えて誰もが罪の状態で当然の ある」

-4

時間は通常、実行するのが安価な最もランダムな操作ですが、予測することはまだ可能です。

真のランダム性が必要な場合は、何らかの外部入力を使用することが唯一の解決策です。

Quantum Random Bit Generatorは、このようなデータを提供する1つのサービスです。

+2

時間はすべてランダムではありません。私はオンラインギャンブルソフトウェアを一度書いたが、時間ベースのランダムジェネレータを使って対処するカードを決めることはできなかった。明らかに、あなたが扱っている手に基づいて、サーバが何時に実行されているかをほぼ推測するのは簡単です。 – rein

+0

真。私はその行を削除します。 –

5

ない厳密C++が、Windowsの特定:

CryptGenRandom

私はすべてのオペレーティングシステムがそれに相当する暗号化された安全なランダムジェネレータ機能を持っていると確信しています。

-2

ランダムは、均一な分布であなたに良い乱数を与え、それでかなり良い仕事をします。

それ以外の場合は、実際に配布を歪めたいということです。

たとえば、MicrosoftのGUIDジェネレータを使用すると、繰り返しにくいランダムIDが与えられ、時間やコンピュータなどのことが考慮されます。

+1

GUIDはランダムではありません –

+0

彼は、暗号化された安全な機能を求めていると思います。質問はあまり明確ではありません。 – Zifre

+0

@Uri Amd「Random give you ...」で参照しているこの「Random」は何ですか? –

16
  • Boost Random Number Libraryは、広範囲のジェネレータ(品質対性能)といくつかの典型的なランダム分布を提供します。むしろ、すごく使いやすく簡単です。
  • 他のメソッドやライブラリが必要な場合は - googleに暗号乱数を入力する場合は、this documentも参考にしてください。
  • フィールド/ etcの専門家/研究者で、通常はスマートピープルによって書かれた既存のソリューションを活用し、他のスマートピープルが徹底的に検討しない限り、独自のソリューションを開発しないでください。
2
int unixrand() 
{ 
    int x; 
    int f = open("/dev/random", O_RDONLY); 
    if (f < 0) return -1; /* Error */ 
    if (sizeof(x) != read(f, &x, sizeof(x))) { 
     close(f); 
     return -1; 
    } 
    close(f);  
    if (x < 0) x = ~x; 
    return x; 
} 
+0

なぜx <0?また、本当にランダムなデータ(暗号化など)が必要な場合を除き、/ dev/urandomがより良い選択になります。/dev/randomはあまりにも貴重なリソースです:) – Paggas

+1

私はCの標準ライブラリ関数のような任意の正のランダムxを返す関数を作っています。はい、ほとんどの場合、/ dev/urandomが優れています。 – Joshua

1

answer I just wroteから同様の質問へのクロス投稿)

ISAAC(間接、シフト、累積、加算、およびカウント)をご覧ください。一様に分布し、平均サイクル長は2^8295です。

それは乗算または法を必要としないので、高速です。

0

ブルース・シュナイアとジョン・ケルシーは、a random number generatorと書いています。むしろ、それはシードジェネレータです。 Yarrowはもはやサポートされていませんが、エントロピーがどのように集まるのか興味があります。

OpenSSL has an APIアクセスが比較的簡単で可搬性に優れています。 Mozillaにはa decent API that wraps whatever the OS offersが付属しています。

個人的には、私は一般的にBoost.Randomを使用していますが、これは既に提案されています。

14

このコードはかなり効率的です。ユーザは数回の反復後にパターンに気付き始めるかもしれないが。

int FastRandom() 
{ 
    return 10; 
} 
+3

LOL !!良いもの! – fengshaun

+1

あなたはちょうど221番の番号をコピーしました:http://xkcd.com/221/ –

+0

意識はありませんでしたが、ええ、良い漫画と私はおそらくそれを見ました! – justinhj

関連する問題