線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2127
推到 Plurk!
推到 Facebook!

取亂數的問題

 
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-02-26 16:35:26 IP:210.242.xxx.xxx 未訂閱
大家好, 請教一個問題:

小弟現在要從 1 至 6 這 6 個數字取亂數, 假設由左至右排列
第一次取完後再取一次
重點是第二次取的亂數排列不能與第一次相同, 任何一個數都不能相同
依此規則, 取完六次為止

小弟目前的做法是用迴圈一直取
並與前幾次取得的結果做比對
遇到相同就重新再取一次

想問一下大家, 有沒有更好的做法
謝謝!
小蚊子
中階會員


發表:55
回覆:267
積分:94
註冊:2002-06-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-02-26 18:15:29 IP:140.135.xxx.xxx 訂閱
感覺您的需求不像亂數...........

若是我的做法...
也許 將 1..6 的數字,全部排列組合一遍,存入 資料檔 中
假設有 10000 筆(10000種組合方式),您的亂數是取這 10000 筆中的某一筆
取用後,做一註記,下次就不會重複取用了.....

Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-02-27 01:06:16 IP:203.67.xxx.xxx 訂閱
hagar大想要的是像這樣嗎?
假設以4個數字來說,每一組解有四個數列並組成一個方陣

1234
4123
3412
2341

1243
3124
4312
2431

1342
2134
4213
3421

1324
4132
2413
3241

1423
3142
2314
4231

1432
2143
3214
4321

這樣的話,以N個數字來說就會有(N-1)! = (4-1)! = 3 * 2=6個組合
hagar大可以先寫個程式窮舉所有組合之後轉成靜態陣列,然後每次就從這6個組合裡面任取一組出來之後對數列的順序作random
如果是1到6的數字,一共會有5*4*3*2個組合,那在產生時只要取random(120)之後,再對該方陣中的六個數列的順序作一次random擺放即可
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-02-27 08:10:30 IP:59.124.xxx.xxx 未訂閱
hagar 大大:

小弟淺見
將取得後做比對,更改為,在取值前,先根據已產生之欄與列取得每個可用 Value List,再從中挑選任一值即可
例如:
已產生的第一組數字為123456,第二組數字為654321,當地三組數字的第一碼為3時,第三組的第二位數字,可選用數字只剩下1,4,6

缺點:可能會無解,需搭配遞迴處理



Fishman
------
Fishman
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-02-28 10:57:11 IP:59.124.xxx.xxx 未訂閱
哇! 都叫小弟大大, 真是不好意思!
小弟只是個喜歡 Delphi 的平凡老百姓...

感謝大家提供小弟思考的方向!
小弟實際要做的是取 24 個數字
用 小蚊子或 Coffee 兄的方法小弟還要想怎麼窮舉所有的組合
目前小弟是用 Fishman 兄的方式取未使用過的數字來排列
不過就像 Fishman 兄說的會有沒有數字可取的狀況
呵...
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-03-03 17:04:31 IP:61.64.xxx.xxx 訂閱
一個非常快又簡單的方法

將你所取的東西改成字串
以 24 為例
字串格式為
AxBxCxDx .....Xx 大寫字母為為標定欄位用,小寫 x 是你的數字,這樣為一組

如 6 7 10 13 21 ..... 變成 A6B7C10D13
然後每一組附加在前一組後方並加上分隔字元,我喜歡用 #10#13
變成 A9B5C11D3...#10#13A6B7C10

這樣用 pos 函式馬上可以比出是否有重複

如果你要取出一位後就比一次,那這樣會很快,因為 system 的 寫得很好,速度 pos 很快
如果你要取出 24 位後才判斷一次,那標定欄位用的那些大寫字母,就可以省了

更是於如果你取出 24 位後才判斷一次,可以直接將之轉成數字,相減不為 0 就是不相同
不過 24 位數,需要10^39 來運算,所以必需拆成兩組
因為 Int64 也只也 10^19
這也好,第一組不相同,第二組也就不用比了

所以將取得的數字,依其位數,到某一位化第一數字,之後為第二數字,只有相減為零,才是一樣,不然絕對數字不同,排列也不同
不過還是要用會圈一一與先前的數字去相減

所以我想還是字串比對會快一點,畢竟只要比一次,且字串可以 2GB 表示 2GB / 39 byte 這麼多組

這樣,不需窮舉,也不需先建表格
沒有取出組數的限制,也沒有數字上的限制,想要用 99 位數,也可以
可想 9999 位數,只有取 10 次
需要為了那 10 次去建立 N 種的表格嗎?我想,就省了吧

不過這只是其中一種解法,還有其他方法,留給大家去想
jasbeing
一般會員


發表:6
回覆:19
積分:5
註冊:2002-08-09

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-03-08 01:34:17 IP:211.76.xxx.xxx 訂閱
利用排序,之後用相減找出相等者,其他部分使用原本方式即可。
系統時間:2024-05-03 5:18:27
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!