// 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
#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