Add a function to return a double in range [0,1).

This commit is contained in:
Nick Mathewson 2010-06-22 21:30:26 -04:00
parent e2b117eb80
commit 006e2e8620
3 changed files with 20 additions and 0 deletions

View file

@ -2056,6 +2056,21 @@ crypto_rand_uint64(uint64_t max)
} }
} }
/** Return a pseudorandom double d, chosen uniformly from the range
* 0.0 <= d < 1.0.
*/
double
crypto_rand_double(void)
{
/* We just use an unsigned int here; we don't really care about getting
* more than 32 bits of resolution */
unsigned int uint;
do {
crypto_rand((char*)&uint, sizeof(uint));
} while (uint == UINT_MAX);
return ((double)uint) / (double)UINT_MAX;
}
/** Generate and return a new random hostname starting with <b>prefix</b>, /** Generate and return a new random hostname starting with <b>prefix</b>,
* ending with <b>suffix</b>, and containing no less than * ending with <b>suffix</b>, and containing no less than
* <b>min_rand_len</b> and no more than <b>max_rand_len</b> random base32 * <b>min_rand_len</b> and no more than <b>max_rand_len</b> random base32

View file

@ -210,6 +210,7 @@ int crypto_seed_rng(int startup);
int crypto_rand(char *to, size_t n); int crypto_rand(char *to, size_t n);
int crypto_rand_int(unsigned int max); int crypto_rand_int(unsigned int max);
uint64_t crypto_rand_uint64(uint64_t max); uint64_t crypto_rand_uint64(uint64_t max);
double crypto_rand_double(void);
char *crypto_random_hostname(int min_rand_len, int max_rand_len, char *crypto_random_hostname(int min_rand_len, int max_rand_len,
const char *prefix, const char *suffix); const char *prefix, const char *suffix);

View file

@ -57,6 +57,7 @@ test_crypto_rng(void)
{ {
int i, j, allok; int i, j, allok;
char data1[100], data2[100]; char data1[100], data2[100];
double d;
/* Try out RNG. */ /* Try out RNG. */
test_assert(! crypto_seed_rng(0)); test_assert(! crypto_seed_rng(0));
@ -76,6 +77,9 @@ test_crypto_rng(void)
big = crypto_rand_uint64(U64_LITERAL(5)); big = crypto_rand_uint64(U64_LITERAL(5));
if (big >= 5) if (big >= 5)
allok = 0; allok = 0;
d = crypto_rand_double();
test_assert(d >= 0);
test_assert(d < 1.0);
host = crypto_random_hostname(3,8,"www.",".onion"); host = crypto_random_hostname(3,8,"www.",".onion");
if (strcmpstart(host,"www.") || if (strcmpstart(host,"www.") ||
strcmpend(host,".onion") || strcmpend(host,".onion") ||