我需要使用rand()
函數來獲得1-15之間的數字,所以我簡單地使用瞭如下函數。如何從rand()函數的範圍中省略一些數字?
num1 = rand()%15+1;
但之間的1-15範圍內,也有一些數字,我想從被分配到num1
變量來防止。
我想過把一個if-else
功能存在,因爲rand()
功能會重演這樣的場合,一個不期望的止跌回升。
但是,我最感興趣的是是否有更有效的方法來省略rand()
函數的範圍中的這些不需要的數字。
非常感謝!
我需要使用rand()
函數來獲得1-15之間的數字,所以我簡單地使用瞭如下函數。如何從rand()函數的範圍中省略一些數字?
num1 = rand()%15+1;
但之間的1-15範圍內,也有一些數字,我想從被分配到num1
變量來防止。
我想過把一個if-else
功能存在,因爲rand()
功能會重演這樣的場合,一個不期望的止跌回升。
但是,我最感興趣的是是否有更有效的方法來省略rand()
函數的範圍中的這些不需要的數字。
非常感謝!
一個非常簡單的解決方案:調用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);
聲音,您想擁有如一組隨機數{1,2,3,7,8,9,14,15}(是不是)?
所以,在這個例子中,這是8個不同值的計數,你可以做這樣的:
lookupTable[] = { 1, 2, 3, 7, 8, 9, 14, 15 };
num1 = lookupTable[rand() % 8];
我已把它放在一個正在運行的例子here。
獲得真正的隨機數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
你的問題是不特定的。爲什麼你在rand上使用'%'?你想要整數值嗎?什麼範圍被排除? –
您應該避免選擇性地丟棄從rand返回的值,因爲這肯定會影響僞隨機數序列的統計特性。請按照owacoder答案中列出的路徑(使用所有值,將它們映射到所需的域)。 – collapsar
@collapsar和rand一起使用mod技巧通常不會給出均勻的分佈,而rand在很多編譯器上的執行效率很差,我會懷疑是否值得擔心。任何對僞隨機數的嚴格要求都不會使用rand!希望OP知道這一點。 –