標準rand()
関数では、私には十分な大きさの数値が得られません。数値が必要unsigned long long
です。本当に大きな乱数を得るにはどうすればよいでしょうか? 単純なハッシュ関数を変更しようとしましたが、大きすぎて、実行に時間がかかりすぎて、1e5 未満の数値が生成されません!!
18444 次
6 に答える
10
ランダムな 64 ビット数を返す移植可能な C99 ソリューションを次に示します。
unsigned long long llrand() {
unsigned long long r = 0;
for (int i = 0; i < 5; ++i) {
r = (r << 15) | (rand() & 0x7FFF);
}
return r & 0xFFFFFFFFFFFFFFFFULL;
}
説明: 0 から32,767 (ランダムな 15 ビット) 以上rand()
の整数を返しますRAND_MAX
。は 64 ビットであることが保証されていますが、それより大きくなる可能性があります。RAND_MAX
long long
于 2015-01-23T18:06:18.337 に答える
2
rand() によって返された値から unsigned long long を生成するだけで、結果の特性を気にしない場合は、コンパイラのバージョンとプラットフォームに依存しない次の関数を検討してください (「マジック ナンバー」が使用されないため)。
// this header has RAND_MAX value
#include <stdlib.h>
// and this header has ULLONG_MAX
#include <limits.h>
unsigned long long ullrand()
// Produces pseudo-random numbers from 0 to ULLONG_MAX
// by filling all bits of unsigned long long integer number
// with bits of several "small" integer numbers generated by rand()
{
unsigned long long myrndnum = 0; // at the beginning just zero
unsigned long long counter = ULLONG_MAX; // at the beginning we have all bits set as 1
// ... and while at least one bit is still set to 1
while(counter > 0) {
myrndnum = (myrndnum * (RAND_MAX + 1)) + rand(); // fill some bits from rand()
counter /= (RAND_MAX + 1); // decrease number of 1-bits in counter
}
// Return the result
return myrndnum;
}
しかし、あらかじめ決められた特定の特性を持つ一連の乱数が必要な場合は、特定のガイドや数学の本を参照する必要があります。例https://www.gnu.org/software/gsl/manual/html_node/Random-number-generator-algorithms.html
于 2015-01-24T22:32:06.970 に答える
0
特定の OS を尋ねたわけではなく、ここでの回答は非常に優れていますが、Linux (およびおそらく他の OS) では、ランダムなデバイスから読み取ることもできます。
例:
#include <stdio.h>
#include <assert.h>
#define RANDDEV "/dev/urandom"
unsigned long long bigrand(void) {
FILE *rdp;
unsigned long long num;
rdp = fopen(RANDDEV, "rb");
assert(rdp);
assert(fread(&num, sizeof(num), 1, rdp) == 1);
fclose(rdp);
return num;
}
携帯で書いているのでバグがあるかもしれません。:P
于 2015-01-24T11:56:42.897 に答える