2012-05-11 243 views
2
generate(vec.begin(), vec.end(), [=](){return static_cast<T>(static_cast<double>(ran()) 
/RAND_MAX*(max-min)+min); }); 

問題:RAND_MAX *(max-min)+ min);Rand_Max *(max-min)+ min <<那是什麼?

好吧,所以我知道算法,lambda表達式和capture子句。我的問題對所有這些都很荒謬。上面的粗體文本是什麼意思。我的意思是,我知道它是隨機值生成過程的一部分。但不知道到底發生了什麼。那麼有人可以打破這個小小的代碼。

回答

8

static_cast<double>(ran())/RAND_MAX*(max-min)+min);

我假設你輸錯rand(),它從0返回到RAND_MAX的僞隨機整數。讓我們重寫在明確了優先位的方式:

(T) ((((double) rand()/RAND_MAX) * (max-min)) + min

那麼,它的作用是:

  1. rand():取0和RAND_MAX
  2. (double)/RAND_MAX之間的隨機整數除法爲RAND_MAX的兩倍,產生在0和1之間的均勻分佈雙:
  3. * (max-min):乘以範圍(max-min),產生一個雙倍E從0到(最大值 - 最小值)
  4. +min:添加最小,得到
  5. static_cast<T> min和max
  6. 之間的隨機雙:將它轉換回原始類型

結果是均勻分佈的在minmax之間的類型T的隨機數。

+3

而統一的_ * _分佈(最小,最大)可能是一個更好的方法來做到這一點。 – bames53

+1

+1我不想嘮叨,因爲他只是問它做了什麼,但使用STL肯定會更有意義。 – smocking

+0

是的,我意識到我愚蠢的括號。詛咒我天空的神靈。 –

2

這是一個隨機函數,在min下限制(因爲rand部分可能返回零)並限制爲max,因爲即使它返回了max-min的100%,並且添加到min,您也會處於max

2

表達static_cast<double>rand()/RAND_MAX通過(max-min)創建0.0和1.0
當乘以之間的一個數,則改變的範圍內,並在添加到min你轉移的範圍內。因此,在表達式之後,您有一個隨機數(雙精度),範圍從minmax

2

您需要查看整個表達式:static_cast<double>(rand()) /RAND_MAX*(max-min)+min)。明確的分組顯示如下:(static_cast<double>(rand()) /RAND_MAX)*(max-min)+min)
第一組返回0 & 1之間的一個隨機值,因爲rand()返回0到RAND_MAX範圍內的值。第二組將0到1範圍轉換爲minmax範圍。

0

ran()函數返回min和max之間的隨機值?

但有時我們需要A和B之間的隨機值(最小值和最大值)。所以我們可以調整它的結果。

a is double, so we use a static_cast! 
a = rand()  ; 0  <= a <= RAND_MAX 
a = a/RAND_MAX ; 0  <= a <= 1 
a = B * a  ; 0  <= a <= B 
a = min +a  ; 0+min <= a <= B+min 

產生分鐘< =一個< =最大,

B+min = max 
B = max-min 

在其他手

a = rand()/RAND_MAX*(max-min) + min 

是最小值和最大值之間的一個隨機數。

+0

除非rand()== RAND_MAX',否則'rand()/ RAND_MAX'爲零。 –

+0

rand()返回一個整數或浮點數?我認爲這是一個浮動。所以rand()/ RAND_MAX不能爲零,如果rand()返回正值。 –

+0

'rand()'返回一個整數:http://en.cppreference.com/w/cpp/numeric/random/rand –