Author Topic: Рандомная последовательность без повтора  (Read 5499 times)

0 Members and 1 Guest are viewing this topic.

Форвард

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Задача вроде не сложная но увы :
Надо перемешать ряд цифр или слов в произвольном порядке
чтобы ни одно не повторялось и не потерялось.

Зачем:
Есть допустим 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 с небольшим не слишком удлиннит....
« Last Edit: February 25, 2013, 08:34:36 AM by Форвард »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Вот скрипт:

Code: (clickermann) [Select]
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 цифр без повтора в случайной последовательности.

Форвард

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Огромное спасибо - буду сегодня пробовать. :)

Может есть еще варианты? Если кто знает....
« Last Edit: February 25, 2013, 01:46:51 PM by Форвард »

Форвард

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
[/code]
Вот скрипт:

Code: (clickermann) [Select]
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: (clickermann) [Select]
// Рандом в лог ограничен длиной алфавита
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
Как то так...
« Last Edit: March 16, 2013, 04:09:29 PM by Форвард »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
В этом случае скобки не нужны

Code: (clickermann) [Select]
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

Форвард

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Согласен.
Благодарю.
У меня там были еще -=_+ и т.д. - можно удлиннять выбор рандома,
а без скобок некоторые знаки теряются кроме букафф
« Last Edit: March 16, 2013, 11:46:33 PM by Форвард »