Android random number generator fixes (use deterministic rng on android).
This commit is contained in:
+13
-7
@@ -156,7 +156,6 @@ SOURCES += \
|
|||||||
src/engine/local_engine/localberoturn.cpp \
|
src/engine/local_engine/localberoturn.cpp \
|
||||||
src/engine/local_engine/localberoriver.cpp \
|
src/engine/local_engine/localberoriver.cpp \
|
||||||
src/engine/local_engine/localberopostriver.cpp \
|
src/engine/local_engine/localberopostriver.cpp \
|
||||||
src/engine/local_engine/tools.cpp \
|
|
||||||
src/engine/local_engine/localbero.cpp \
|
src/engine/local_engine/localbero.cpp \
|
||||||
src/engine/local_engine/localexception.cpp \
|
src/engine/local_engine/localexception.cpp \
|
||||||
src/engine/local_engine/arraydata.cpp \
|
src/engine/local_engine/arraydata.cpp \
|
||||||
@@ -205,6 +204,13 @@ SOURCES += \
|
|||||||
src/net/common/sendbuffer.cpp \
|
src/net/common/sendbuffer.cpp \
|
||||||
src/net/common/receivebuffer.cpp
|
src/net/common/receivebuffer.cpp
|
||||||
|
|
||||||
|
!android{
|
||||||
|
SOURCES += src/engine/local_engine/tools.cpp
|
||||||
|
}
|
||||||
|
android{
|
||||||
|
SOURCES += src/engine/local_engine/tools_android.cpp
|
||||||
|
}
|
||||||
|
|
||||||
official_server{
|
official_server{
|
||||||
INCLUDEPATH += pkth_stat/daemon_lib/src
|
INCLUDEPATH += pkth_stat/daemon_lib/src
|
||||||
DEFINES += POKERTH_OFFICIAL_SERVER
|
DEFINES += POKERTH_OFFICIAL_SERVER
|
||||||
@@ -225,12 +231,12 @@ win32{
|
|||||||
}
|
}
|
||||||
|
|
||||||
mac{
|
mac{
|
||||||
# make it x86_64 only
|
# make it x86_64 only
|
||||||
CONFIG += x86_64
|
CONFIG += x86_64
|
||||||
CONFIG -= x86
|
CONFIG -= x86
|
||||||
CONFIG -= ppc
|
CONFIG -= ppc
|
||||||
QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.6
|
QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.6
|
||||||
QMAKE_CXXFLAGS -= -std=gnu++0x
|
QMAKE_CXXFLAGS -= -std=gnu++0x
|
||||||
|
|
||||||
# for universal-compilation on PPC-Mac uncomment the following line
|
# for universal-compilation on PPC-Mac uncomment the following line
|
||||||
# on Intel-Mac you have to comment this line out or build will fail.
|
# on Intel-Mac you have to comment this line out or build will fail.
|
||||||
|
|||||||
@@ -18,6 +18,10 @@
|
|||||||
|
|
||||||
#define NOMINMAX // for Windows
|
#define NOMINMAX // for Windows
|
||||||
|
|
||||||
|
#ifdef ANDROID
|
||||||
|
#error This file is not for android.
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "tools.h"
|
#include "tools.h"
|
||||||
#include <core/loghelper.h>
|
#include <core/loghelper.h>
|
||||||
#include <core/openssl_wrapper.h>
|
#include <core/openssl_wrapper.h>
|
||||||
@@ -26,8 +30,6 @@
|
|||||||
#include <boost/nondet_random.hpp>
|
#include <boost/nondet_random.hpp>
|
||||||
#include <boost/random/uniform_int.hpp>
|
#include <boost/random/uniform_int.hpp>
|
||||||
#include <boost/random/variate_generator.hpp>
|
#include <boost/random/variate_generator.hpp>
|
||||||
#include <set>
|
|
||||||
#include <limits>
|
|
||||||
|
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
@@ -68,27 +70,3 @@ void Tools::GetRand(int minValue, int maxValue, unsigned count, int *out)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Tools::GetRandUnique(int minValue, int maxValue, unsigned count, int *out)
|
|
||||||
{
|
|
||||||
InitRandState();
|
|
||||||
unsigned numCreated = 0;
|
|
||||||
int *startPtr = out;
|
|
||||||
set<int> tmpSet;
|
|
||||||
for (unsigned i = 0; i < count; i++) {
|
|
||||||
boost::uniform_int<> dist(minValue, maxValue - numCreated);
|
|
||||||
boost::variate_generator<boost::random_device&, boost::uniform_int<> > gen(*g_rand_state, dist);
|
|
||||||
*startPtr = gen();
|
|
||||||
set<int>::const_iterator v = tmpSet.begin();
|
|
||||||
set<int>::const_iterator end = tmpSet.end();
|
|
||||||
while (v != end) {
|
|
||||||
if (*v <= *startPtr) {
|
|
||||||
(*startPtr)++;
|
|
||||||
}
|
|
||||||
++v;
|
|
||||||
}
|
|
||||||
tmpSet.insert(*startPtr);
|
|
||||||
startPtr++;
|
|
||||||
numCreated++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
@@ -25,9 +25,6 @@ public:
|
|||||||
|
|
||||||
static void ShuffleArrayNonDeterministic(int *inout, unsigned count);
|
static void ShuffleArrayNonDeterministic(int *inout, unsigned count);
|
||||||
static void GetRand(int minValue, int maxValue, unsigned count, int *out);
|
static void GetRand(int minValue, int maxValue, unsigned count, int *out);
|
||||||
static void GetRandUnique(int minValue, int maxValue, unsigned count, int *out);
|
|
||||||
|
|
||||||
//static void getRandNumber(int, int, int, int*, bool, int* = 0, int = 0);
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,72 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* PokerTH - The open source texas holdem engine *
|
||||||
|
* Copyright (C) 2006-2011 Felix Hammer, Florian Thauer, Lothar May *
|
||||||
|
* *
|
||||||
|
* This program is free software: you can redistribute it and/or modify *
|
||||||
|
* it under the terms of the GNU Affero General Public License as *
|
||||||
|
* published by the Free Software Foundation, either version 3 of the *
|
||||||
|
* License, or (at your option) any later version. *
|
||||||
|
* *
|
||||||
|
* This program is distributed in the hope that it will be useful, *
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||||
|
* GNU Affero General Public License for more details. *
|
||||||
|
* *
|
||||||
|
* You should have received a copy of the GNU Affero General Public License *
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#define NOMINMAX // for Windows
|
||||||
|
|
||||||
|
#ifndef ANDROID
|
||||||
|
#error This file is only for android.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "tools.h"
|
||||||
|
#include <core/loghelper.h>
|
||||||
|
#include <core/openssl_wrapper.h>
|
||||||
|
|
||||||
|
#include <boost/thread.hpp>
|
||||||
|
#include <boost/random/mersenne_twister.hpp>
|
||||||
|
#include <boost/random/uniform_int.hpp>
|
||||||
|
#include <boost/random/variate_generator.hpp>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
boost::thread_specific_ptr<boost::mt19937> g_rand_state;
|
||||||
|
|
||||||
|
struct det_rng : std::unary_function<unsigned, unsigned> {
|
||||||
|
boost::mt19937 &_state;
|
||||||
|
unsigned operator()(unsigned i) {
|
||||||
|
boost::uniform_int<> rng(0, i - 1);
|
||||||
|
return rng(_state);
|
||||||
|
}
|
||||||
|
det_rng(boost::mt19937 &state) : _state(state) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline void InitRandState()
|
||||||
|
{
|
||||||
|
if (!g_rand_state.get()) {
|
||||||
|
g_rand_state.reset(new boost::mt19937(static_cast<unsigned>(std::time(0))));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Tools::ShuffleArrayNonDeterministic(int *inout, unsigned count)
|
||||||
|
{
|
||||||
|
// On android, a deterministic rng is used (for now).
|
||||||
|
InitRandState();
|
||||||
|
det_rng rand(*g_rand_state);
|
||||||
|
random_shuffle(&inout[0], &inout[count], rand);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Tools::GetRand(int minValue, int maxValue, unsigned count, int *out)
|
||||||
|
{
|
||||||
|
InitRandState();
|
||||||
|
boost::uniform_int<> dist(minValue, maxValue);
|
||||||
|
boost::variate_generator<boost::mt19937&, boost::uniform_int<> > gen(*g_rand_state, dist);
|
||||||
|
int *startPtr = out;
|
||||||
|
for (unsigned i = 0; i < count; i++) {
|
||||||
|
*startPtr++ = gen();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Reference in New Issue
Block a user