const float maxweight = 0.3;
const float scaleweight = 32767;
void main()
5.產生一定範圍隨機數的通用表示公式
要取得[a,b)的隨機整數,使用(rand() % (b-a))+ a;
要取得[a,b]的隨機整數,使用(rand() % (b-a+1))+ a;
要取得(a,b]的隨機整數,使用(rand() % (b-a))+ a + 1;
通用公式:a + rand() % n;其中的a是起始值,n是整數的範圍。
要取得a到b之間的隨機整數,另一種表示:a + (int)b * rand() / (rand_max + 1)。
要取得0~1之間的浮點數,可以使用rand() / double(rand_max)。
如果讓你用c++來生成0——n-1之間的隨機數,你會怎麼做?你可能會說,很簡單,看:
srand( (unsigned)time( null ) );
rand() % n;
仔細想一下,這個結果是隨機的嗎(當然,我們不考慮rand()函式的偽隨機性)?
不是的,因為rand()的上限是rand_max,而一般情況下,rand_max並不是n的整數倍,那麼如果rand_max % =r,則0——r之間的數值的概率就要大一些,而r+1——n-1之間的數值的概率就要小一些。還有,如果n > rand_max,那該怎麼辦?
下面給出一種比較合適的方案,可以生成任意範圍內的等概率隨機數 result。最後還有乙個更簡單的方法。
1、如果n
r = rand_max-(rand_max+1)%n; //去除尾數
t = rand();
while( t > r ) t = rand();
result = t % n; // 符合要求的隨機數
2、如果 n>rand_max,可以考慮分段抽樣,分成[n/(rnad_max+1)]段,先等概率得到段再得到每段內的某個元素,這樣分段也類似地有乙個尾數問題,不是每次都剛好分到整數段,一定或多或少有乙個餘數段,這部分的值如何選取?
選到餘數段的資料拿出來選取,先進行一次選到餘數段概率的事件發生,然後進行單獨選取:
r = n % (rand_max+1); //餘數
result = n-r+myrandom(r); // myrandom可以用情況1中的**實現
else
result = rand()+myrandom(n/(rand_max+1))*(rand_max+1); // 如果選不到餘數段再進行分段選取
if(probability<=0)
if(probability
if(rand()<=probability*(rand_max+1))
return false;
}long myrandom(long n)//產生0~n-1之間的等概率隨機數
return t % n;
} else
else }
} 還有另外一種非常簡單的方式,那就是使用
random_shuffle( randomaccessiterator _first, randomaccessiterator _last ).
例如,生成0——n-1之間的隨機數,可以這麼寫
#include
#include
long myrandom( long n )
std::random_shuffle( vl.begin(), vl.end() );
return (*vl.begin());
}random_shuffle 還有乙個三引數的過載版本
random_shuffle( randomaccessiterator _first, randomaccessiterator _last, randomnumbergenerator& _rand )
第三個引數可以接受乙個自定義的隨機數生成器來把前兩個引數之間的元素隨機化。
這個方法的缺陷就是,如果只是需要乙個隨機數的話,當n很大時,空間消耗很大!
在一定範圍內生成隨機數
問題 給定乙個最小正整數和乙個最大正整數,如何在它們之間生成隨機數 包含上下界 1 它生成的隨機數範圍是 0,2 它所使用數值的型別是uint32,並不是int,因此需要做型別轉換。因為使用arc4random uniform 函式生成的隨機數不包含上界,但是我們的題目要求包含上界,所以在上下界相減...
C 生成一定範圍內固定個數的隨機數
隨機數 在某次產生過程中按照實驗過程中表現的分布概率隨機產生的,其結果是不可 的,是不可見的。一般使用的是偽隨機的。常使用函式rand 產生隨機數,但是隨機數值的範圍在0至rand max 間,rand max與使用資料型別有關。int randnum 10 for int i 0 i randnu...
生成指定範圍的隨機數 生成某個範圍的隨機數
每次進行將本地 提交到遠端的時候總會要求輸入賬號和密碼 git push origin master 而且會彈出以下介面 我輸入賬號和密碼,明明是對的,卻提示登陸失敗 logon failed,use ctrl c to cancel basic credential prompt.會彈出這個登陸框...