Что нового

Функция Random без повторов значений

vadimkou

Новичок
Сообщения
17
Репутация
2
Есть следующая функция
Код:
Func My_Func()
    $res = Random(1, 3, 1)
        If $res = 1 Then
        Клик браузера по первой кнопке

        ElseIf $res = 2 Then
       Клик браузера по второй кнопке

        ElseIf $res = 3 Then
        Клик браузера по третьей кнопке

        EndIf

EndFunc

Как зделать так, чтобы все три кнопки были нажаты, но не более раза? Потому что функция Random может выбрать два одинаковые значения. Если кто сталкивался или знает, посоветуйте
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
http://autoit-script.ru/index.php/topic,6462.0.html
 
Автор
V

vadimkou

Новичок
Сообщения
17
Репутация
2
Спасибо за функцию, но я долго разбирался, и не могу понять как вывести результаты по отдельности с фиксированием переменных, а не все результаты вместе в одной строке?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
vadimkou,
Попробуйте так.
Код:
Global $iMin = 8, _ ;минимальное значение
		$iMax = 14, _ ;максимальное значение
		$iCount = 3, _ ;сколько раз можно использовать
		$iRes, $iNum, $iN, $iAll = ($iMax - $iMin + 1)

If $iMax <= $iMin Or $iCount <= 0 Then
	MsgBox(16, 'Error', 'Error $iMin, $iMax or $iCount')
	Exit
EndIf

Dim $aRandom[$iAll + 1][2] = [[$iAll]]
For $i = 1 To $aRandom[0][0]
	$aRandom[$i][0] = $i + $iMin - 1
Next

While 1
	$iRes = _RandomCount()
	$iNum = @extended
	If $iNum < 0 Then ExitLoop
	$iN += 1
	MsgBox(64, $iN & '(' & $iAll * $iCount & ')', 'Random: ' & $iRes & @LF & 'Count: ' & $iNum)
	ConsoleWrite('Random: ' & $iRes & @TAB & 'Count: ' & $iNum & @LF)
WEnd
MsgBox(64, $iN & '(' & $iAll * $iCount & ')', 'End')

Func _RandomCount()
	Local $i_Random, $s_String = '|', $i_Count
	While $i_Count < $iMax - $iMin + 1
		$i_Random = Random($iMin, $iMax, 1)
		If Not StringInStr($s_String, '|' & $i_Random & '|') Then
			For $i = 1 To $aRandom[0][0]
				If $i_Random = $aRandom[$i][0] And $aRandom[$i][1] < $iCount Then
					$aRandom[$i][1] += 1
					Return SetExtended($aRandom[$i][1], $i_Random)
				EndIf
			Next
			$s_String &= $i_Random & '|'
			$i_Count += 1
		EndIf
	WEnd
	Return SetExtended(-1)
EndFunc   ;==>_RandomCount
Переношу тему, т.к. отношения к Автоматизации IE и Web-интерфейса она не имеет.
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
vadimkou
Вот такую методику я использовал для перемешивания картинок без повторений...

Код:
; НАЧАЛО

 #Include <Array.au3>

 $COUNT=100

 Global $RND[$COUNT+1]
 For $J=1 To $COUNT
  $RND[$J]=$J
 Next
 $J=$COUNT-1
 While $J>1
  $U=Random(0,$J)
  $K=Floor($U)+1
  $T=$RND[$K]
  $RND[$K]=$RND[$J]
  $RND[$J]=$T
  $J-=1
 WEnd

 _ArrayDisplay($RND)

; КОНЕЦ
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
Я для таких случаев использую это:

Код:
#include <Array.au3>

;Will generate 5 random numbers, where maximum possible number is 5, and minimum is 1
$aRet = _GenerateRandomNumbers(5, 5, 1) ;This one shows that this function generate really *different* random numbers :)

_ArrayDisplay($aRet)

;Will generate 25 random numbers, where maximum possible number is 150, and minimum is 10
$aRet = _GenerateRandomNumbers(25, 150, 10)

_ArrayDisplay($aRet)

;$iGenerateNums - Total numbers to generate.
;$iMaxEachNum - Largest number to be generated.
;$iMinEachNum - Smallest number to be generated.
;Note: $iGenerateNums can not be grater than ($iMaxEachNum - $iMinEachNum) + 1
Func _GenerateRandomNumbers($iGenerateNums, $iMaxEachNum, $iMinEachNum=0)
	If $iGenerateNums > ($iMaxEachNum - $iMinEachNum) + 1 Then Return SetError(1, 0, 0)
	
	Local $aRandom[$iGenerateNums]
	
	For $i = 0 To $iGenerateNums-1
		While 1
			$aRandom[$i] = Random($iMinEachNum, $iMaxEachNum, 1)
			
			For $j = 0 To $iGenerateNums-1
				If $j = $i Then ContinueLoop
				If $aRandom[$j] = $aRandom[$i] Then ContinueLoop 2
			Next
			
			ExitLoop
		WEnd
	Next
	
	Return $aRandom
EndFunc


Кстати, в 3.3.8.0 это не работает, спотыкается на проверке синтаксиса (ContinueLoop), хотя синтаксис вполне правильный.
 

C2H5OH

AutoIT Гуру
Сообщения
1 473
Репутация
333
Код:
;)

#Include <Array.au3>

$COUNT=100

Global $BASE[$COUNT+1]
 For $J=1 To $COUNT
  $RND[$J]=$J
 Next
Global $RND[$COUNT+1]

For $J=$COUNT To 1 Step -1
  $I=Random(1,$J,1)
  $RND[$COUNT-$J+1] = $BASE[$I]
  $BASE[$I]= $BASE[$J]
Next

_ArrayDisplay($RND)

Сами понимаете, просто усовершенствовал код snoitaleRа :IL_AutoIt_1:
 

XpycT

Скриптер
Сообщения
380
Репутация
132
vadimkou [?]
и не могу понять как вывести результаты по отдельности
Вот так функция выдас массив
Код:
#Include <Array.au3>

$aRandom = _RandomEx(1, 3, 3, 1, 1)
_ArrayDisplay($aRandom)

; #FUNCTION# ==============================================================================================================
; Name...........: _RandomEx
; Description ...: Function generates a random numbers and displays them in a specified format.
; Syntax.........: _RandomEx($_iSNum, $_iENum, $_iRNumCount, $_iRetFormat, $_sRetDelimiter, $_iUnique)
; Parameters ....: $_iSNum         - The smallest number to be generated. The default is 0.
;                  $_iENum         - The largest number to be generated. The default is 1.
;                  $_iRNumCount    - Quantity of random numbers
;                  $_iRetFormat    - Return format (0 = String (Default), 1 = Array)
;                  $_sRetDelimiter - Random numbers delimeter if return format is string. The default is ","
;                  $_iUnique       - Specified if generated random numbers should be unique (0 = not unique, 1 = unique (Default))
; Return values .: Success - Return random numbers between $_iSNum and $_iENum in specified format.
;                  Failure - 0, sets @error  Returns 0 and sets @error flag to 1 if bad parameters
;                  |1 - $_iSNum equally or greater $_iENum
;                  |2 - Quantity of possible unique random numbers is less requested
; Author ........: XpycT, idea of return in string format madmasles http://autoit-script.ru/index.php/topic,6344.msg44489.html#msg44489
; =========================================================================================================================
Func _RandomEx($_iSNum = 0, $_iENum = 1, $_iRNumCount = 1, $_iUnique = 1, $_iRetFormat = 0, $_sRetDelimiter = ",")
    Local $sRNumStr = "`", $iNumCount = 0

    If $_iSNum >= $_iENum Then Return SetError(1, 0, 0)
    If $_iUnique And ($_iENum - $_iSNum + 1) < $_iRNumCount Then Return SetError(2, 0, 0)

    While $iNumCount <> $_iRNumCount
        $iRNum = Random($_iSNum, $_iENum, 1)

        If $_iUnique = 1 Then
            If Not StringInStr($sRNumStr, "`" & $iRNum & "`") Then
                $sRNumStr &= $iRNum & "`"

                $iNumCount += 1
            EndIf
        Else
            $sRNumStr &= $iRNum & "`"

            $iNumCount += 1
        EndIf
    WEnd
    $sRNumStr = StringTrimLeft(StringTrimRight($sRNumStr, 1), 1)

    If $_iRetFormat = 0 Then Return StringReplace($sRNumStr, "`", $_sRetDelimiter)
    If $_iRetFormat = 1 Then Return StringSplit($sRNumStr, "`")
EndFunc
 

SyDr

Сидра
Сообщения
651
Репутация
158
CreatoR [?]
Кстати, в 3.3.8.0 это не работает, спотыкается на проверке синтаксиса (ContinueLoop), хотя синтаксис вполне правильный.
Наверное какой-то спецефичный баг проверки синтаксиса. Можно немного изменить код и всё будет работать:

Код:
If $aRandom[$j] = $aRandom[$i] Then
					ContinueLoop 2
				EndIf
 
Автор
V

vadimkou

Новичок
Сообщения
17
Репутация
2
Спасибо за функции, вы даже не представляете как помогли :smile:
 
Верх