[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[or-cvs] [tor/master 27/28] Add a function to return a double in range [0,1).
Author: Nick Mathewson <nickm@xxxxxxxxxxxxxx>
Date: Tue, 22 Jun 2010 21:30:26 -0400
Subject: Add a function to return a double in range [0,1).
Commit: 006e2e8620fa9001c8df24463c06538cf58ce396
---
src/common/crypto.c | 15 +++++++++++++++
src/common/crypto.h | 1 +
src/test/test_crypto.c | 4 ++++
3 files changed, 20 insertions(+), 0 deletions(-)
diff --git a/src/common/crypto.c b/src/common/crypto.c
index 1a1dad6..23e2a42 100644
--- a/src/common/crypto.c
+++ b/src/common/crypto.c
@@ -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>,
* 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
diff --git a/src/common/crypto.h b/src/common/crypto.h
index 1b004dd..a30e5bc 100644
--- a/src/common/crypto.h
+++ b/src/common/crypto.h
@@ -210,6 +210,7 @@ int crypto_seed_rng(int startup);
int crypto_rand(char *to, size_t n);
int crypto_rand_int(unsigned int 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,
const char *prefix, const char *suffix);
diff --git a/src/test/test_crypto.c b/src/test/test_crypto.c
index 7aca098..b475914 100644
--- a/src/test/test_crypto.c
+++ b/src/test/test_crypto.c
@@ -57,6 +57,7 @@ test_crypto_rng(void)
{
int i, j, allok;
char data1[100], data2[100];
+ double d;
/* Try out RNG. */
test_assert(! crypto_seed_rng(0));
@@ -76,6 +77,9 @@ test_crypto_rng(void)
big = crypto_rand_uint64(U64_LITERAL(5));
if (big >= 5)
allok = 0;
+ d = crypto_rand_double();
+ test_assert(d >= 0);
+ test_assert(d < 1.0);
host = crypto_random_hostname(3,8,"www.",".onion");
if (strcmpstart(host,"www.") ||
strcmpend(host,".onion") ||
--
1.7.1