Author Topic: Генератор случайных неповторяющихся чисел  (Read 1223 times)

0 Members and 1 Guest are viewing this topic.

asdada2

  • Зашел в гости
  • *
  • Posts: 2
    • View Profile
Здравствуйте!
Вопрос к математикам:
Как сделать компактный генератор случайных неповторяющихся чисел? Эта порнуха, что изображена ниже -  работает, но занимает много пространства + для каждого доп. числа нужно добавлять 5 строчек кода. Как можно преобразовать это в один цикл "for"?


Code: (clickermann) [Select]

                               $C1 = 1
               $Work[$C1] = RND(1,5)

INC($C1)
$Work[$C1] = RND(1,5)
WHILE($Work[$C1] = $Work[$C1-1])
$Work[$C1] = RND(1,5)
END_CYC

INC($C1)
$Work[$C1] = RND(1,5)
WHILE($Work[$C1] = $Work[$C1-1] | $Work[$C1] = $Work[$C1-2])
$Work[$C1] = RND(1,5)
END_CYC

INC($C1)
$Work[$C1] = RND(1,5)
WHILE($Work[$C1] = $Work[$C1-1] | $Work[$C1] = $Work[$C1-2] | $Work[$C1] = $Work[$C1-3])
$Work[$C1] = RND(1,5)
END_CYC

INC($C1)
$Work[$C1] = RND(1,5)
WHILE($Work[$C1] = $Work[$C1-1] | $Work[$C1] = $Work[$C1-2] | $Work[$C1] = $Work[$C1-3] | $Work[$C1] = $Work[$C1-4])
$Work[$C1] = RND(1,5)
END_CYC

PRINT($Work[1])
PRINT($Work[2])
PRINT($Work[3])
PRINT($Work[4])
PRINT($Work[5])
PRINT(______)
« Last Edit: February 09, 2021, 10:54:23 PM by asdada2 »

4.У.В.@.К

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Привет!
Во тут есть два готовых решения, со строкой и с массивом:
http://crapware.aidf.org/forum/index.php?topic=1965.msg11825

Я не математик, по этому вот вариант, который мне показался проще.))
И на большом диапазоне цифр, он работает намного быстрее.
Code: (clickermann) [Select]
LOGCLEAR

FOR($n = 0, $n <= 50) // собираем входной массив из цифр - от 0 до 50
   ARRPUSH($arr, $n)
END_CYC

FOR($i = ARRSIZE($arr) - 1, $i > -1, -1)
   $n = RND(0,$i)
   LOGWRITE ($arr[$n]) // рандомная цифра в лог
   $arr[$n] = $arr[$i]
   $del = ARRPOP($arr)
END_CYC

HALT

asdada2

  • Зашел в гости
  • *
  • Posts: 2
    • View Profile
Привет!
Во тут есть два готовых решения, со строкой и с массивом:
http://crapware.aidf.org/forum/index.php?topic=1965.msg11825

Я не математик, по этому вот вариант, который мне показался проще.))
И на большом диапазоне цифр, он работает намного быстрее.
Code: (clickermann) [Select]
LOGCLEAR

FOR($n = 0, $n <= 50) // собираем входной массив из цифр - от 0 до 50
   ARRPUSH($arr, $n)
END_CYC

FOR($i = ARRSIZE($arr) - 1, $i > -1, -1)
   $n = RND(0,$i)
   LOGWRITE ($arr[$n]) // рандомная цифра в лог
   $arr[$n] = $arr[$i]
   $del = ARRPOP($arr)
END_CYC

HALT

Супер! Спасибо Вам!