找回密码
 加入
搜索
查看: 3474|回复: 6

[效率算法] 抽奖程序,不放回算法,各位大侠帮忙看看(附源码)

  [复制链接]
发表于 2011-12-22 08:12:39 | 显示全部楼层 |阅读模式
如题,按照我写的抽奖结果总是有重复!?不知道是那里出错了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2011-12-22 12:26:27 | 显示全部楼层
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

#include <Array.au3>

Opt("MustDeclareVars", 1)

Global Const $gc_FormName = "随机数字"

#Region
Global $gu_Form1 = GUICreate($gc_FormName, 304, 105, -1, -1)
Global $gu_Group1 = _ 
        GUICtrlCreateGroup("29选7随机选号", 8, 8, 289, 57)
Global $gu_Input1 = GUICtrlCreateInput("", 16, 32, 33, 21, _
                BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER))
Global $gu_Input2 = GUICtrlCreateInput("", 56, 32, 33, 21, _
                BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER))
Global $gu_Input3 = GUICtrlCreateInput("", 96, 32, 33, 21, _
                BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER))
Global $gu_Input4 = GUICtrlCreateInput("", 136, 32, 33, 21, _
                BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER))
Global $gu_Input5 = GUICtrlCreateInput("", 176, 32, 33, 21, _
                BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER))
Global $gu_Input6 = GUICtrlCreateInput("", 216, 32, 33, 21, _
                BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER))
Global $gu_Input7 = GUICtrlCreateInput("", 256, 32, 33, 21, _
                BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER))
GUICtrlCreateGroup("", -99, -99, 1, 1)
Global $gu_Button1 = GUICtrlCreateButton("关于", 8, 72, 49, 25)
Global $gu_Button2 = GUICtrlCreateButton("选号", 192, 72, 49, 25)
Global $gu_Button3 = GUICtrlCreateButton("复制", 248, 72, 49, 25)
#EndRegion

Global $gua_Input[8] = ["", $gu_Input1, $gu_Input2, $gu_Input3, _
                $gu_Input4, $gu_Input5, $gu_Input6, $gu_Input7]

_Main()
Exit

Func _Main()
        GUISetState(@SW_SHOW)
        
        Local $nMsg
        While 1
                $nMsg = GUIGetMsg()
                Switch $nMsg
                        Case $GUI_EVENT_CLOSE
                                Exit
                        Case $gu_Button1
                                MsgBox(0 + 64, $gc_FormName, _ 
                                        "本程序用于29选7随机选号")
                        Case $gu_Button2
                                Local $a_Numbers = _RandomNumber()
                                _SortArray($a_Numbers)
                                _DisplayNumbers($a_Numbers)
                        Case $gu_Button3
                                _CopyNumbersToClip()
                EndSwitch
        WEnd
EndFunc   ;==>_Main

Func _RandomNumber()
        Local $a_Numbers[1], $p = 1
        While $p <= 7
                Local $Number = Random(1, 29, 1)
                Local $i, $f = 1
                For $i = 1 To UBound($a_Numbers, 1) - 1
                        If $a_Numbers[$i] = $Number Then
                                $f = 0
                                ExitLoop
                        EndIf
                Next
                If $f = 1 Then
                        ReDim $a_Numbers[$p + 1]
                        $a_Numbers[$p] = $Number
                        $p += 1
                EndIf
        WEnd
        ;;_ArrayDisplay($a_Numbers,"$a_Numbers")
        Return $a_Numbers
EndFunc   ;==>_RandomNumber

Func _SortArray(ByRef $a_Array)
        Local $i
        For $i = 1 To UBound($a_Array, 1) - 2
                Local $j
                For $j = $i + 1 To UBound($a_Array, 1) - 1
                        If $a_Array[$i] > $a_Array[$j] Then
                                _ExchangeNumber($a_Array[$i], $a_Array[$j])
                        EndIf
                Next
        Next
        ;;_ArrayDisplay($a_Array,"$a_Numbers")
EndFunc   ;==>_SortArray

Func _ExchangeNumber(ByRef $Num1, ByRef $Num2)
        Local $t
        $t = $Num1
        $Num1 = $Num2
        $Num2 = $t
EndFunc   ;==>_ExchangeNumber

Func _DisplayNumbers($a_Numbers)
        Local $i
        For $i = 1 To 7
                GUICtrlSetData($gua_Input[$i], $a_Numbers[$i])
        Next
EndFunc   ;==>_DisplayNumbers

Func _CopyNumbersToClip()
        Local $s = ""
        Local $i
        For $i = 1 To UBound($gua_Input, 1) - 1
                $s &= GUICtrlRead($gua_Input[$i]) & ", "
        Next
        $s = StringTrimRight($s, 2)
        ClipPut($s)
EndFunc   ;==>_CopyNumbersToClip
研究一下这个吧!Skyfree写的!
 楼主| 发表于 2011-12-22 16:25:23 | 显示全部楼层
回复 2# hzxymkb


    谢谢了
发表于 2011-12-23 11:29:41 | 显示全部楼层
本帖最后由 xiehuahere 于 2011-12-23 11:32 编辑

回复 2# hzxymkb


    这个29选7的选号算法貌似也有点问题,不管选多少次,前面三个从未出现20以上的数,最后两个从未出现10以内的数。
发表于 2011-12-23 17:40:12 | 显示全部楼层
本帖最后由 einiter 于 2011-12-25 20:12 编辑

最重要的是最后一个数字!是29选7最后一个就不用比前面的大了!!
Func _SortArray(ByRef $a_Array)
        Local $i
        For $i = 1 To UBound($a_Array, 1) - 3 这里应该是减3吧???
                Local $j
                For $j = $i + 1 To UBound($a_Array, 1) - 1
                        If $a_Array[$i] > $a_Array[$j] Then
                               _ExchangeNumber($a_Array[$i], $a_Array[$j])
                        EndIf
                Next
        Next
        ;;_ArrayDisplay($a_Array,"$a_Numbers")
EndFunc   ;==>_SortArray
发表于 2011-12-29 09:39:30 | 显示全部楼层
只要不重复吗?
#include <array.au3>

Local $number[30]
For $i=1 To 29
        $number[$i]=$i
Next

Local $output
For $i=1 To 7
        $random=Random(1,UBound($number)-1,1)
        $output&=$number[$random]&@CRLF
        _ArrayDelete($number,$random)
Next
MsgBox(0,0,$output)
发表于 2011-12-29 13:15:50 | 显示全部楼层
3mile这方法不错,
我以前是用一个数组记录获奖的编号,再在循环中和这个记录对比的
不次改用3mile的方法
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-4-27 15:25 , Processed in 0.093034 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表