]> Git Repo - VerusCoin.git/blobdiff - src/random.h
Merge pull request #128 from miketout/dev
[VerusCoin.git] / src / random.h
index aa55ca2b6f3125663eaa0af7136cd34a23acc0ef..8cec678ef99e972a3650f5a2bf735b27440473ea 100644 (file)
@@ -1,6 +1,6 @@
 // Copyright (c) 2009-2010 Satoshi Nakamoto
-// Copyright (c) 2009-2014 The Bitcoin developers
-// Distributed under the MIT/X11 software license, see the accompanying
+// Copyright (c) 2009-2014 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
 
 #ifndef BITCOIN_RANDOM_H
@@ -8,22 +8,47 @@
 
 #include "uint256.h"
 
+#include <functional>
 #include <stdint.h>
 
 /**
- * Seed OpenSSL PRNG with additional entropy data
+ * Functions to gather random data via the libsodium CSPRNG
  */
-void RandAddSeed();
-void RandAddSeedPerfmon();
-
-/**
- * Functions to gather random data via the OpenSSL PRNG
- */
-void GetRandBytes(unsigned char* buf, int num);
+void GetRandBytes(unsigned char* buf, size_t num);
 uint64_t GetRand(uint64_t nMax);
 int GetRandInt(int nMax);
 uint256 GetRandHash();
 
+/**
+ * Identity function for MappedShuffle, so that elements retain their original order.
+ */
+ int GenIdentity(int n);
+
+/**
+ * Rearranges the elements in the range [first,first+len) randomly, assuming
+ * that gen is a uniform random number generator. Follows the same algorithm as
+ * std::shuffle in C++11 (a Durstenfeld shuffle).
+ *
+ * The elements in the range [mapFirst,mapFirst+len) are rearranged according to
+ * the same permutation, enabling the permutation to be tracked by the caller.
+ *
+ * gen takes an integer n and produces a uniform random output in [0,n).
+ */
+template <typename RandomAccessIterator, typename MapRandomAccessIterator>
+void MappedShuffle(RandomAccessIterator first,
+                   MapRandomAccessIterator mapFirst,
+                   size_t len,
+                   std::function<int(int)> gen)
+{
+    for (size_t i = len-1; i > 0; --i) {
+        auto r = gen(i+1);
+        assert(r >= 0);
+        assert(r <= i);
+        std::swap(first[i], first[r]);
+        std::swap(mapFirst[i], mapFirst[r]);
+    }
+}
+
 /**
  * Seed insecure_rand using the random pool.
  * @param Deterministic Use a deterministic seed
This page took 0.025358 seconds and 4 git commands to generate.