廣告廣告
  加入我的最愛 設為首頁 風格修改
首頁 首尾
 手機版   訂閱   地圖  簡體 
您是第 8351 個閱讀者
 
發表文章 發表投票 回覆文章
  可列印版   加為IE收藏   收藏主題   上一主題 | 下一主題   
對的人
個人頭像
個人文章 個人相簿 個人日記 個人地圖
特殊貢獻獎
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x0 鮮花 x228
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片
推文 x0
[C/C++][求助] 隨機取數,該如何不讓它重複
各位大大好^^,我剛學程式不久,有許多問題,還需要大大多多幫忙^^。

像我這個隨機取數,如果想要讓他不出現重複的號碼,該怎做? 麻煩大大給點迷津,謝謝。

#include<iostream.h>
#include<stdlib.h>
void main()
{
int i,a;
char o; ..

訪客只能看到部份內容,免費 加入會員 或由臉書 Google 可以看到全部內容



獻花 x0 回到頂端 [樓 主] From:台灣亞太線上 | Posted:2006-12-28 00:08 |
codeboy 手機
個人文章 個人相簿 個人日記 個人地圖
社區建設獎
小有名氣
級別: 小有名氣 該用戶目前不上站
推文 x6 鮮花 x331
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

先把得到的亂數存起來..取一個就去比對之前的陣列裡是不是已經有同樣的數字
如果已經有了,就重新再去取一次....一直循環到你需要的量~ 表情



連結有問題請來信,我會盡快修正~^^
通報時請附上是"哪一篇失效"...這樣我才能去修正~麻煩各位好心人士了~

[連結失效通報][ 網頁.伺服.程式 討論區]
----------------------在世界中心呼喊愛情----------------------
深深思念一個人的時候,我們不知不覺的地活在世界的中心...
獻花 x0 回到頂端 [1 樓] From:未知地址 | Posted:2006-12-29 17:52 |
drizztkuo
數位造型
個人文章 個人相簿 個人日記 個人地圖
路人甲
級別: 路人甲 該用戶目前不上站
推文 x0 鮮花 x2
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

介紹以前用過一個方式,類似洗排的方法。(很久沒寫程式了!用字遣詞可能不太精準)
先確認需要的隨機數長度n,例如:要取200個3碼長的亂數,但是這兩百個亂數不能重複。
其大概作法如下:
1. 先設定000 ~ 999的數列(因為需要三碼)
2. 以random方式調換該數列中各元素的次序,例如調換1000次。
3. 依序取出該數列中前200個元素,保證不會重複。
此方式的好處是確保該程序的執行時間固定(僅受n影響),不會有運氣不佳而需要多取幾次的情況。

此文章被評分,最近評分記錄
財富:40 (by codeboy) | 理由: 這也是一個好方法..^^


獻花 x0 回到頂端 [2 樓] From:臺灣 | Posted:2007-01-03 17:34 |
tr99632 手機
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x0 鮮花 x17
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

阿哈哈哈~
好死不死 前幾天在圖書館裡翻到一本書
上面剛好就有取亂數不重複的範例 XD

書名:C&C++完美的演譯
作者:松橋工作室

範例是給大樂透取7個號碼

複製程式
#include<iostream.h>
#include<stdlib.h>
#include<time.h>
void main()
{
       srand(time(NULL));
       int max=49;
       int n[49]={0};
       int x[7]={0};
       for(int i=0;i<max;i++)//將1~49灌入 陣列n[]裡面
              n[i]=i+1;
       for(int j=0;j<7;j++)//取7個數字
       {
              int choice;
              choice=rand()%max;
              x[j]=n[choice];//隨機將n[]陣列裡的一個數字給予x[]
              for(int k=choice;k<max;k++)       //進行遞補
                     n[k]=n[k+1];
              max--;
       }
       for(int s=0;s<7;s++)
              cout<<x[s]<<"  "<<endl;
//       for(i=0;i<49;i++)
//              cout<<"n["<<i<<"]= "<<n[i]<<endl;
}


方法就是
先隨機將n[]陣列裡的一個數字給予x[]
然後將n[]陣列中 被抽出的數字後面的數字通通往前遞補一格

給個例子:
1.
choice取亂數得到3
2.
x[0]=n[3]
此時x[0]=4
3.
n[]進行遞補動作

n[3]=n[4]
n[4]=n[5]
n[5]=n[6]
n[6]=n[7]
n[7]=n[8]
.........

此時的
n[]陣列為:複製程式
n[0]n[1]n[2]n[3]n[4]n[5]n[6]n[7]...n[46]n[47]n[48]
   1    2    3     5    6    7    8     9       48     49    49

x[]陣列為:複製程式
x[0]x[1]x[2]x[3]x[4]x[5]x[6]
   4    0    0    0    0    0    0

4.
因為n[]陣列進行過遞補
所以max要減1

5.繼續取亂數


獻花 x0 回到頂端 [3 樓] From:臺灣臺北市 | Posted:2007-01-13 01:34 |

首頁  發表文章 發表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.082290 second(s),query:16 Gzip disabled
本站由 瀛睿律師事務所 擔任常年法律顧問 | 免責聲明 | 本網站已依台灣網站內容分級規定處理 | 連絡我們 | 訪客留言