Что нового

[Массивы] Радномный выбор значения массива без повторов.

sss

Продвинутый
Сообщения
332
Репутация
96
Есть двумерный массив 10х10. Значения - 0,1,2. Надо рандомно выбрать часть массива с значением 0 (например 5х2) и заменить на значение 1. Если просто генерировать функцией Random и потом "если значение=0 то менять на 1" - вначале нормально, а потом очень долго выбирает. Сразу скажу, что это для функции, опирающейся на эти значения. Работать будет по нажатию кнопки (1 значение за 1 нажатие). Как это можно реализовать?
P.S: Извиняюсь что так сложно и косноязычно написал - по-другому как-то не получилось ))
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Sky-WaLkeR [?]
Если просто генерировать функцией Random и потом "если значение=0 то менять на 1" - вначале нормально, а потом очень долго выбирает.
Пример.
 

asa12

Новичок
Сообщения
66
Репутация
3
Код:
MouseClick ("left",$g2[0], $g2[1], Random(9,16))
Sleep(400)
MouseClick ("right",$g2[0], $g2[1],20);меню выпущенных дронов
sleep(800);4 сверху 3 меню добывать постоянно
MouseMove(767, 83, Random(9,16))
MouseClick ("left",767, 83)

Вот пожалуйста пример, всё ещё в цикле, вызывается каждые секунд 6-7
Грузит комп просто пипец. Скрипт из-за этого просто не работает после некоторого времени.
Пришлось отказаться от random. После этого всё нормально. Может есть какие то ограничения на функцию?
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Так? :
Код:
#include <Array.au3>
Global $aArr[10][10]
; заполнение
For $i = 0 To 9
    For $j = 0 To 9
        $aArr[$i][$j] = Random(0, 2, 1)
    Next
Next
_ArrayDisplay($aArr) ; исходное состояние
Do
    _arraychecker()
Until _ArraySearch($aArr, 0) = -1
_ArrayDisplay($aArr) ; состояние на выходе
Func _arraychecker()
    Local $iGet
    Local $iOne
    Local $iTwo
    Do
        $iOne = Random(0, 9, 1)
        $iTwo = Random(0, 9, 1)
        $iGet = $aArr[$iOne][$iTwo]
    Until $iGet = 0
    ConsoleWrite('[' & $iOne & '][' & $iTwo & ']' & @CRLF)
    $aArr[$iOne][$iTwo] = 1
EndFunc
 

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Sky-WaLkeR
Так массив двумерный или нет? Вот код для двумерного массива:
При нажатии на клавишу "m" случайной переменной в массиве присваевается единица.
При нажатии клавиши "d" массив выводится на экран.

Код:
#include <Array.au3>

Dim $Array[10][10]
Dim $Operativ_Array[100] ;$Array = 10x10
Dim $Random, $z_1, $z_2, $Number

For $i = 0 To UBound($Operativ_Array) - 1
	$Operativ_Array[$i] = $i
Next

HotKeySet("m", "_ClickMouse")
HotKeySet("ь", "_ClickMouse")
HotKeySet("d", "_Display")
HotKeySet("в", "_Display")

While 1
#comments-start
Текс Вашего кода....
#comments-end
Sleep(5000)
WEnd

Func _Display()
	_ArrayDisplay($Array)
EndFunc

Func _ClickMouse()
	If IsArray($Operativ_Array) Then
		$Random = Random(0, UBound($Operativ_Array) - 1, 1)
		$Number = $Operativ_Array[$Random]
		If $Number < 10 Then
			$z_1 = 0
			$z_2 = $Number
		ElseIf $Number >= 10 Then
			$z_1 = Floor($Number / 10)
			$z_2 = Mod($Number, 10)
		EndIf
		$Array[$z_1][$z_2] = 1
		_ArrayDelete($Operativ_Array, $Random)
		ConsoleWrite("Переменная $Array[" & $z_1 & "]" & "[" & $z_2 & "]" & " изменена на 1." & @CRLF)
	Else
		MsgBox(0, "Complete", "Все значения массива равняются 1!")
		Exit
	EndIf
EndFunc
 
Автор
sss

sss

Продвинутый
Сообщения
332
Репутация
96
Спасибо! Получилось!
 

asa12

Новичок
Сообщения
66
Репутация
3
CreatoR сказал(а):
asa12
Ну и где тут двумерный массив, и где тут выбор значения из массива?
У меня такая же проблема, как у автора темы. Пришло в голову, а random после объявления значения освобождает память?
 
Верх