2015-11-09 33 views
2

我需要使用rand()函數來獲得1-15之間的數字,所以我簡單地使用瞭如下函數。如何從rand()函數的範圍中省略一些數字?

num1 = rand()%15+1; 

但之間的1-15範圍內,也有一些數字,我想從被分配到num1變量來防止。

我想過把一個if-else功能存在,因爲rand()功能會重演這樣的場合,一個不期望的止跌回升。

但是,我最感興趣的是是否有更有效的方法來省略rand()函數的範圍中的這些不需要的數字。

非常感謝!

+0

你的問題是不特定的。爲什麼你在rand上使用'%'?你想要整數值嗎?什麼範圍被排除? –

+0

您應該避免選擇性地丟棄從rand返回的值,因爲這肯定會影響僞隨機數序列的統計特性。請按照owacoder答案中列出的路徑(使用所有值,將它們映射到所需的域)。 – collapsar

+0

@collapsar和rand一起使用mod技巧通常不會給出均勻的分佈,而rand在很多編譯器上的執行效率很差,我會懷疑是否值得擔心。任何對僞隨機數的嚴格要求都不會使用rand!希望OP知道這一點。 –

回答

6

一個非常簡單的解決方案:調用rand(),其模數值等於輸出範圍內的總數。然後定義映射函數將值映射到您所需的特定輸出範圍。

例如:拿到1和5或11和15之間的隨機值,包括:

int map(int val) 
{ 
    if (val > 5) 
     return val+5; 
    else 
     return val; 
} 

int value = rand()%10+1; 
value = map(value); 
5

聲音,您想擁有如一組隨機數{1,2,3,7,8,9,14,15}(是不是)?

所以,在這個例子中,這是8個不同值的計數,你可以做這樣的:

lookupTable[] = { 1, 2, 3, 7, 8, 9, 14, 15 }; 
num1 = lookupTable[rand() % 8]; 

我已把它放在一個正在運行的例子here

3

獲得真正的隨機數1到15之間,你可以使用這樣的C++代碼11:

#include <iostream> 
#include <random> 

int main() 
{ 
     std::random_device rd; 
     std::mt19937 mt(rd()); 
     std::uniform_int_distribution<int> dist(1, 15); 

    for (int i = 0; i < 100; ++i) 
     std::cout << dist(mt) << ", "; 

} 

要刪除一些這個號碼就可以使用map的建議owacoder 你也看到的視頻(從MS的傢伙是誰寫的關於如何獲得真正的隨機數VS STL的一部分),爲什麼rand不能用於那些:

https://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful

相關問題