台灣最大程式設計社群網站
線上人數
1938
 
會員總數:245979
討論主題:189557
歡迎您免費加入會員
討論區列表 >> C/C++ >> 猜數字 之 如何不讓亂數重複
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
猜數字 之 如何不讓亂數重複
價值 : 10 QP  點閱數:1018 回應數:4
樓主

李念倫
門外漢
0 1
24 1
發送站內信

捐贈 VP 給 李念倫
各位好 現在比較閒 想寫個猜數字玩一下
但腦袋完全卡住了 請問要怎樣才可以讓隨機數字不重複呢
我用一個陣列放 random number 試了好幾次for迴圈檢查 但都失敗...誰可救救我
[code]
srand(time(NULL));
int array[4];

int a=0;
int b=0;

//check repeat
//空空空 無解

//print answer
for(int i=0; i<4; i++){
cout << array[i] << " ";
}

//compare four number to play the game
do{
cout << "a" << a << " b" << b << endl;
a=0; b=0;
for(int i=0; i<4; i++){
cin >> input[i]; //input four number
for(int j=0; j<4; j++){
if(input[i] == array[j] && i!=j){
b++;
}else if(input[i] == array[j] && i==j){
a++;
}
}
}
}while(a!=4);
[/code]




搜尋相關Tags的文章: [ 陣列檢查 ] ,
本篇文章發表於2016-10-20 16:28
1樓
作者回應

李念倫
捐贈 VP 給 李念倫 檢舉此回應
[code]
int main ()
{
srand(time(NULL));
int array[4];

int a=0;
int b=0;

//check random number has no repeat

for(int i=0; i<4; i++){
array[i] = rand() % 9 + 1;
}

//print answer
for(int i=0; i<4; i++){
cout << array[i] << " ";
}

//compare four number to play the game
do{
cout << "a" << a << " b" << b << endl;
a=0; b=0;
for(int i=0; i<4; i++){
cin >> input[i]; //input four number
for(int j=0; j<4; j++){
if(input[i] == array[j] && i!=j){
b++;
}else if(input[i] == array[j] && i==j){
a++;
}
}
}
}while(a!=4);


system("pause");
}
[/code]
本篇文章回覆於2016-10-20 16:32
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

Raymond
檢舉此回應
數字不重複, 尤其是小組數目內的不重複, 其實有很標準的作法, 就是「洗牌法」.

1. 把所有可能出現的數字放入陣列裡. 這已保證了不重複.
2. 做「洗牌」的動作.
3. 取出陣列前 N 筆資料.

「洗牌」的動作很簡單, 就是依序從陣列的第一個元素開始, 把它的內容跟一個任意選擇的元素交換.



本篇文章回覆於2016-10-21 05:42
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

淺水員
檢舉此回應
有另一個方法是每次取亂數的時候,檢查這個亂數是不是被使用過,如果用過就再取亂數,直到沒重複為止。

本篇文章回覆於2016-10-21 15:00
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

Raymond
檢舉此回應
如果要從非常大的數組中要抽出幾個非重複的數字 (比方說從 1~10000 裡抽出10 個不重複的數字), 那洗牌法就不適合, 因為所需陣列非常大. 在這情況下, 3 樓的方法就比較適合.

不同的邏輯適合不同的資料特性, 如果事先不知道資料的特性, 3 樓的方法是「標準」的作法. 如果用 C++, 存放不重複數字的容器最好用 std::set (需要標準頭檔 <set>) 來存放. std::set 本身保證存放資料不重複.

如果有支援 C++11 語言標準的編譯器, 上面的 for() 可以這麼寫:


本篇文章回覆於2016-10-21 22:22
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.