2012-12-03 77 views
2

我在VS2010項目中使用std::variate_generator以下列方式:的std :: variate_generator在VS2012

#include <random> 
... 
using std::variate_generator; 
using std::mt19937; 
using std::uniform_real_distribution; 

typedef mt19937          Engine; 
typedef uniform_real_distribution<float>   Distribution; 
typedef variate_generator< Engine, Distribution > Generator; 

Generator r(Engine((DWORD)time(NULL)), Distribution(0.0f, 1.0f)); 

// from now, calling float rnd = r() gave me a random number between 0.0f and 1.0f in rnd. 

我現在已經把這個代碼放到一個VS2012的解決方案,我得到的錯誤信息是std::variate_generator不是std的成員。

std::variate_generator移動或被刪除?

+1

AAH。它已被刪除。嘖。 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1933.pdf – fishfood

+0

一些額外的評論;您不必爲分配指定範圍,因爲零到一是默認值;你可以使用''庫來獲得時間,如果這是你想要初始化引擎的時間,並且如果你使用更高分辨率的時鐘之一,那麼你將能夠以每秒更快的速度初始化不同的引擎;你也可以使用'std :: random_device'來獲得種子;如果你想要一個明確的演員(沉默一個警告,我猜?)'DWORD'可能不是你應該使用的類型。 – bames53

回答

4

variate_generators不用於最終的標準版本<random>。 variate_generator是tr1的一部分,但從來沒有成爲標準,所以我有點驚訝std::variate_generator在VS2010工作(而不是std::tr1::variate_genrator)。不過,我相信它仍然存在於VS2012的tr1命名空間中。

你可以做,而不是執行以下操作:

#include <random> 
#include <functional> // for std::bind 
... 
using std::mt19937; 
using std::uniform_real_distribution; 

typedef mt19937          Engine; 
typedef uniform_real_distribution<float>   Distribution; 

auto r = std::bind(Distribution(0.0f, 1.0f), Engine((DWORD)time(NULL))); 

// from now, calling float rnd = r() gave me a random number between 0.0f and 1.0f in rnd. 
+0

這是否會向下兼容VS2010? – fishfood

+1

是的,vs2010的'std :: bind'實現就足夠了。 – bames53