// arbitrary size random integer from std::rand().
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <limits.h>
#include <assert.h>
#include <stdio.h>
#include <time.h>
// can be any unsigned type.
typedef uint32_t uint_type;
#define RAND_UINT_MAX ((uint_type) -1)
uint_type rand_uint(void)
{
// these are all constant and factor is likely a power of two.
// therefore, the compiler has enough information to unroll
// the loop and can use an immediate form shl in-place of mul.
uint_type factor = (uint_type) RAND_MAX + 1;
uint_type factor_to_k = 1;
uint_type cutoff = factor ? RAND_UINT_MAX / factor : 0;
uint_type result = 0;
while ( 1 ) {
result
+= rand() * factor_to_k
; if (factor_to_k <= cutoff)
factor_to_k *= factor;
else
return result;
}
}
int main(int argc, char* argv[])
{
#define BITS 2
#define SIZE (1U << BITS)
size_t uintbit = sizeof(uint_type) * CHAR_BIT;
for ( int j = 0; j < uintbit/BITS; j++ ) {
int bucket[SIZE] = {};
// expect @ 1000 hits/bucket.
// if any buckets are zero or too far off, something is wrong.
for ( int i = 0; i < SIZE*1000; i++ )
bucket[(rand_uint() >> j*BITS) % SIZE]++;
for ( int i = 0; i < SIZE; i++ )
printf("b[%-2d:%-2d) = %-4d ", j
*BITS
, (j
+1)*BITS
, bucket
[i
]); }
return 0;
}
Ly8gYXJiaXRyYXJ5IHNpemUgcmFuZG9tIGludGVnZXIgZnJvbSBzdGQ6OnJhbmQoKS4KCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGludC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxsaW1pdHMuaD4KI2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHRpbWUuaD4KCi8vIGNhbiBiZSBhbnkgdW5zaWduZWQgdHlwZS4KdHlwZWRlZiB1aW50MzJfdCB1aW50X3R5cGU7CiNkZWZpbmUgUkFORF9VSU5UX01BWCAoKHVpbnRfdHlwZSkgLTEpCgp1aW50X3R5cGUgcmFuZF91aW50KHZvaWQpCnsKCS8vIHRoZXNlIGFyZSBhbGwgY29uc3RhbnQgYW5kIGZhY3RvciBpcyBsaWtlbHkgYSBwb3dlciBvZiB0d28uCgkvLyB0aGVyZWZvcmUsIHRoZSBjb21waWxlciBoYXMgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHVucm9sbAoJLy8gdGhlIGxvb3AgYW5kIGNhbiB1c2UgYW4gaW1tZWRpYXRlIGZvcm0gc2hsIGluLXBsYWNlIG9mIG11bC4KCXVpbnRfdHlwZSBmYWN0b3IgPSAodWludF90eXBlKSBSQU5EX01BWCArIDE7Cgl1aW50X3R5cGUgZmFjdG9yX3RvX2sgPSAxOwoJdWludF90eXBlIGN1dG9mZiA9IGZhY3RvciA/IFJBTkRfVUlOVF9NQVggLyBmYWN0b3IgOiAwOwoJdWludF90eXBlIHJlc3VsdCA9IDA7CgkKCXdoaWxlICggMSApIHsKCQlyZXN1bHQgKz0gcmFuZCgpICogZmFjdG9yX3RvX2s7CgkJaWYgKGZhY3Rvcl90b19rIDw9IGN1dG9mZikKCQkJZmFjdG9yX3RvX2sgKj0gZmFjdG9yOwoJCWVsc2UKCQkJcmV0dXJuIHJlc3VsdDsKCX0KfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKewojZGVmaW5lIEJJVFMgMgojZGVmaW5lIFNJWkUgKDFVIDw8IEJJVFMpCgoJc2l6ZV90IHVpbnRiaXQgPSBzaXplb2YodWludF90eXBlKSAqIENIQVJfQklUOwoJYXNzZXJ0KHVpbnRiaXQgJSBCSVRTID09IDApOwoKCXNyYW5kKHRpbWUoTlVMTCkpOwkKCWZvciAoIGludCBqID0gMDsgaiA8IHVpbnRiaXQvQklUUzsgaisrICkgewoJCWludCBidWNrZXRbU0laRV0gPSB7fTsKCQkvLyBleHBlY3QgQCAxMDAwIGhpdHMvYnVja2V0LgoJCS8vIGlmIGFueSBidWNrZXRzIGFyZSB6ZXJvIG9yIHRvbyBmYXIgb2ZmLCBzb21ldGhpbmcgaXMgd3JvbmcuCgkJZm9yICggaW50IGkgPSAwOyBpIDwgU0laRSoxMDAwOyBpKysgKQoJCQlidWNrZXRbKHJhbmRfdWludCgpID4+IGoqQklUUykgJSBTSVpFXSsrOwoJCWZvciAoIGludCBpID0gMDsgaSA8IFNJWkU7IGkrKyApCgkJCXByaW50ZigiYlslLTJkOiUtMmQpID0gJS00ZCAgIiwgaipCSVRTLCAoaisxKSpCSVRTLCBidWNrZXRbaV0pOwoJCXByaW50ZigiXG4iKTsKCX0KCXJldHVybiAwOwp9Cg==