Автокликер Clickermann :: Форум
		Основной раздел => Общие вопросы => Topic started by: Форвард on February 24, 2013, 06:20:44 PM
		
			
			- 
				Задача вроде не сложная но увы : 
 Надо перемешать ряд цифр или слов в произвольном порядке
 чтобы ни одно не повторялось и не потерялось.
 
 Зачем:
 Есть допустим 20 блоков кода которые должны быть выполнены в произвольной последовательности и причем все (или определенное число) не повторяясь.
 
 Функцию такую не нашел.
 А goto(rndfrom(1,2,3,......,20) или gosub(rndfrom(a,b,c,.....k) дает только одно значение. И если повторять 20 раз, то будут не нужные повторы.
 
 Может есть простое решение?
 
 Пока придумалось решение через опу - через запись в 2 файла.
 И пробовать прицепить фильтр....
 
 Попробовал делать это через запись в файл так как очередной блок из 20  запускается примерно раз в час. Но пока не решилось как.
 
 В первый записывается вначале все 20 цифр.
 STRWRITELN("volni.txt","1,2,3,4,5,...20",0)
 
 Во второй записывается одна циферка увы:
 STRWRITELN("volni1.txt",RNDFROM(1,2,3,4,5,...20),0)
 
 И после фильтром была идея исключать каждую последнюю циферку из основной последовательности "volni.txt"
 STRFILTER("string", "set", 0)
 Но как это связать не понял так  как в справке написано - фильтр возвращает цифру или значение... куда возращает??? как это виртуальное возвращает хз куда увязать с продолжением исключения основной последовательности....
 
 И уже уменьшенный на одну записанную циферку список вставлять в
 STRWRITELN("volni.txt","......
 
 Далее опять полученную следующую рандомную циферку вставить в
 STRWRITELN("volni1.txt",RNDFROM(
 
 И опять фильтр
 и тд... по кругу пока все 20 цифр не кончатся... и будет щастье....
 
 в итоге должен появиться файлик volni1.txt со столбиком (и его можно перевести в строку) из 20  циферок в уже рандомном порядке которые можно считать из него командой чтения нужной строки из файла... и задача решена.... по идее...
 
 но вот пока не понял и не прочуствовал термин "возвращает"
 и как пользоваться соответственно фильтром если он конечно поможет
 Через IF и переменную????
 
 другого варианта пока не вижу как просто взять перемешать цифры....
 может кто сталкивался с похожим... или натолкнет на мыслю...
 заранее спасибо....
 
 Ну можно конечно еще написать и вставить 400 строк (20х20=400) с рандомным неповторяющимся расположением цифр )))) и уже 400 вариантов выбирать через GOSUB(RNDFROM(... но это совсем по американски будет.....
 хотя сам код уехал так за 10.000 строк и еще +400 с небольшим не слишком удлиннит....
- 
				Вот скрипт:
 
 LOGCLEAR
 $r = "1234567890"
 
 WHILE($c = 0)
 $f = INT(STRCUT($r, RND(1, STRLEN($r)), 1))
 IF(STRLEN($r) > 1)
 $r = INT(STRFILTER ($r, $f, 0))
 Else
 $c = 1
 END_IF
 LOGWRITE($f)
 WAITMS(50)
 END_CYC
 HALT
 Он выдает в лог 10 цифр без повтора в случайной последовательности.
- 
				Огромное спасибо - буду сегодня пробовать. :)
 
 Может есть еще варианты? Если кто знает....
- 
				[/code]Вот скрипт:
 
 LOGCLEAR
 $r = "1234567890"
 
 WHILE($c = 0)
 $f = INT(STRCUT($r, RND(1, STRLEN($r)), 1))
 IF(STRLEN($r) > 1)
 $r = INT(STRFILTER ($r, $f, 0))
 Else
 $c = 1
 END_IF
 LOGWRITE($f)
 WAITMS(50)
 END_CYC
 HALT
 Он выдает в лог 10 цифр без повтора в случайной последовательности.
 
 
 Оравен спасибо за помощь и отдельное ОГРОМНОЕ спасибо за науку!  :)
 
 Подучился и переделал твой скрипт на увеличенное количество повторов:
 
 // Рандом в лог ограничен длиной алфавита 
 LOGCLEAR
 
 $r = "ABCDEFGHIJKLMNOPQWVXYZ"
 $a = STRLEN($r)
 
 FOR($c, $c < $a)
 $f = (STRCUT($r, RND(1, STRLEN($r)), 1))
 IF(STRLEN($r) > 1)
 $r = STRFILTER($r, $f, 0)
 END_IF
 LOGWRITE($f)
 WAITMS(50)
 END_CYC
 
 HALT
Как то так...
 
- 
				В этом случае скобки не нужны
 
 LOGCLEAR
 
 $r = "ABCDEFGHIJKLMNOPQWVXYZ"
 $a = STRLEN($r)
 
 FOR($c, $c < $a)
 $f = STRCUT($r, RND(1, STRLEN($r)), 1)
 IF(STRLEN($r) > 1)
 $r = STRFILTER($r, $f, 0)
 END_IF
 LOGWRITE($f)
 WAITMS(50)
 END_CYC
 
 HALT
- 
				Согласен. 
 Благодарю.
 У меня там были еще -=_+ и т.д. - можно удлиннять выбор рандома,
 а без скобок некоторые знаки теряются кроме букафф