設(shè)為首頁收藏本站Access中國

Office中國論壇/Access中國論壇

 找回密碼
 注冊

QQ登錄

只需一步,快速開始

返回列表 發(fā)新帖
查看: 3160|回復(fù): 4
打印 上一主題 下一主題

[幫助] 關(guān)于隨機(jī)產(chǎn)生不重復(fù)數(shù)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2010-1-20 10:15:29 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
前天,同事要我?guī)兔ψ鲆粋(gè)舒爾特方格的測試軟件,我答應(yīng)了。
在該軟件中需要生成1-25以內(nèi)的隨機(jī)不重復(fù)數(shù)。根據(jù)網(wǎng)上搜尋的結(jié)果,我利用rud()函數(shù)。
可是,不知道什么問題,有些時(shí)候還是會(huì)生成重復(fù)數(shù)據(jù)。所以我只好利用了笨方法重新生成隨機(jī)數(shù)據(jù)。

壇子里面的高手,能否幫我看看問題在什么地方。如果能夠解決生成重復(fù)數(shù)問題,我這個(gè)程序就可以大大簡化了。

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號(hào)?注冊

x
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 分享淘帖 訂閱訂閱
2#
發(fā)表于 2010-1-20 11:50:27 | 只看該作者
見附件,新加了一個(gè)按鈕,和你原來的代碼沒有多大聯(lián)系,不過還是要用到那個(gè)TABLE.
另外,我的算法越往后越費(fèi)時(shí), 即25個(gè)只剩1個(gè)未選中時(shí), 需求隨機(jī)直至那個(gè)選中為止. 你可以自己優(yōu)化一下,只填20個(gè)文本框,后面的5個(gè)數(shù)按順序填入剩下的5個(gè)文本框就行.

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號(hào)?注冊

x
3#
發(fā)表于 2010-1-20 11:53:33 | 只看該作者
自己測了一下,汗,18秒,中等水平.
4#
 樓主| 發(fā)表于 2010-1-20 14:05:20 | 只看該作者
謝謝方漠版主,使用“Me.Controls("Text" & I) ”后代碼少多了(我一直再找這個(gè)代碼寫法)。
我曾有一個(gè)想法,就是每提取一次數(shù)據(jù),就產(chǎn)生一個(gè)查詢,查詢沒有被使用的數(shù)字后生成帶自動(dòng)編號(hào)的表,然后再在此表中隨機(jī)提取一個(gè)數(shù),如此類推。這樣一來,就肯定不會(huì)出現(xiàn)重復(fù)數(shù)的問題了。但是,我沒有解決查詢后增加自動(dòng)編號(hào)字段的問題。
5#
發(fā)表于 2010-1-21 19:55:03 | 只看該作者
如何產(chǎn)生不重復(fù)的隨機(jī)數(shù)?
先創(chuàng)建個(gè)類模塊:Random

類模塊代碼如下:

  1. Dim c As Collection
  2. '初始化,定義產(chǎn)生隨機(jī)數(shù)的最小值和最大值
  3. Public Sub Init(min As Integer, max As Integer)
  4. Set c = New Collection
  5. Dim i As Integer
  6.     For i = min To max
  7.         c.Add i
  8.     Next
  9. End Sub
  10. '產(chǎn)生不重復(fù)的隨機(jī)數(shù)
  11. Public Function RandomNext() As Integer
  12. Dim i As Integer
  13. Dim number As Integer, upperbound As Integer
  14.     upperbound = c.Count
  15.     If upperbound > 0 Then
  16.         number = Int((upperbound) * Rnd + 1)
  17.         RandomNext = CInt(c.Item(number))
  18.         c.Remove (number)
  19.     Else
  20.         RandomNext = 0
  21.     End If
  22. End Function
  23. Private Sub Class_Terminate()
  24.     Set c = Nothing
  25. End Sub
復(fù)制代碼


測試:

  1. Dim r As New Random
  2.   
  3. Sub Test() '請先運(yùn)行Init
  4. Dim i As Integer
  5.     For i = 0 To 10
  6.        Debug.Print r.RandomNext
  7.     Next
  8. End Sub
  9. Sub Init()
  10.     r.Init 1, 100
  11. End Sub
復(fù)制代碼
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則

QQ|站長郵箱|小黑屋|手機(jī)版|Office中國/Access中國 ( 粵ICP備10043721號(hào)-1 )  

GMT+8, 2024-10-23 08:24 , Processed in 0.200779 second(s), 29 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表