Author Topic: Рандом!  (Read 6048 times)

0 Members and 1 Guest are viewing this topic.

Skomopox

  • Освоившийся
  • **
  • Posts: 56
    • View Profile
Рандом!
« on: September 18, 2014, 08:56:48 AM »
Привет Всем! Глупо, конечно, но как сделать, чтобы из 20 чисел выбирало 8 рандомно?
Пример: Есть 20 чисел, от 1 до 20.  Как написать так, чтобы из этих 20 чисел выбирало 8 рандомно, И, ни одно число друг с другом не пересекалось. Т.е. если через цикл делать, то оно может несколько раз число 5 взять, например, и тогда уже не получится 8 чисел, а 5-6. Нужно ведь как-то, что бы они проверялись друг с другом, да? У кого какие мысли есть? Спасибо!

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Рандом!
« Reply #1 on: September 18, 2014, 09:53:05 AM »
Привет Всем! Глупо, конечно, но как сделать, чтобы из 20 чисел выбирало 8 рандомно?
Пример: Есть 20 чисел, от 1 до 20.  Как написать так, чтобы из этих 20 чисел выбирало 8 рандомно, И, ни одно число друг с другом не пересекалось. Т.е. если через цикл делать, то оно может несколько раз число 5 взять, например, и тогда уже не получится 8 чисел, а 5-6. Нужно ведь как-то, что бы они проверялись друг с другом, да? У кого какие мысли есть? Спасибо!

Вариантов есть несколько. Вот один из них:
Code: (clickermann) [Select]
#name "RND unique"
// Author: AVint
// Version: 1.0 (18.09.2014)

// создаём массив 1-20
FOR($i, $i < 20)
   ARRPUSH($arr, $i+1)
END_CYC

// берём 8 случайных чисел
FOR($j, $j<8)
   $r = RND(0,ARRSIZE($arr)-1)
   LOGWRITE ("RND = ", $arr[$r]) // выводим наше случайное число  $arr[$r]
   // как нужно обрабатываем
   
   // удаляем число из массива
   FOR($i=$r+1, $i < ARRSIZE($arr))  // передвигаем
      $arr[$i-1] = $arr[$i]
   END_CYC
   $empty = ARRPOP($arr)  // удаляем последний элемент
END_CYC


IF(1) // 1 - показать остаток
   LOGWRITE ("")
   LOGWRITE ("остаток")
   FOR($i, $i < ARRSIZE($arr))
      LOGWRITE ($arr[$i])
   END_CYC
END_IF

HALT

« Last Edit: September 18, 2014, 10:00:54 AM by Vint »


Skomopox

  • Освоившийся
  • **
  • Posts: 56
    • View Profile
Re: Рандом!
« Reply #2 on: September 18, 2014, 10:01:40 AM »
Привет Игорь! Как всегда :) Спасибо, сейчас посмотрю. Блин не успел переделать. Есть ещё вопрос прям вообще глупый, наверное, не могу на форуме нигде найти.
 Про массив: - Как увеличить массив на один??? Я имею виду... вот что в общем:
$p[3]=1
inc($p[3],1)
Почему не работает с массивами inc? Как можно увеличить значение массива на один, чтобы $p[3] стал не 1, а уже 2? Спасибо, если кто увидит!

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Рандом!
« Reply #3 on: September 18, 2014, 10:06:48 AM »
пока наверно только так, по простому
Code: (clickermann) [Select]
$p[3] = $p[3]+1


Skomopox

  • Освоившийся
  • **
  • Posts: 56
    • View Profile
Re: Рандом!
« Reply #4 on: September 18, 2014, 10:13:38 AM »
Аааааа... :) Точно! Я же делал так раньше, да за был :) Спасибо. И Скрипт, удивительно работает, только не могу понять как? Вот сижу разбираюсь. Для того, чтобы понять где мне обрабатывать можно моё потом. Благодарю, в общем :)

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Рандом!
« Reply #5 on: September 18, 2014, 10:26:12 AM »
Там где написано "обрабатываем" само число $arr[$r]
Чтобы не внедрять в середину цикла или не делать подпрограмму, можно все 8 засунуть в новый массив.
И обрабатывать где нужно.
Code: (clickermann) [Select]
#name "RND unique"
// Author: AVint
// Version: 1.1 (18.09.2014)

// создаём массив 1-20
FOR($i, $i < 20)
   ARRPUSH($arr, $i+1)
END_CYC

// берём 8 случайных чисел
FOR($j, $j<8)
   $r = RND(0,ARRSIZE($arr)-1)
   //LOGWRITE ("RND = ", $arr[$r])
   ARRPUSH($result, $arr[$r])
   
   FOR($i=$r+1, $i < ARRSIZE($arr))
      $arr[$i-1] = $arr[$i]
   END_CYC
   $empty = ARRPOP($arr)
END_CYC

//$result - результат в этом массиве
//$X = ARRPOP($result)


Skomopox

  • Освоившийся
  • **
  • Posts: 56
    • View Profile
Re: Рандом!
« Reply #6 on: September 18, 2014, 10:30:10 AM »
Да, я дотупил! Так и сделал. НО, КАК ты это сделал, мне вообще не понятно?! Так и не разобрался, с этими попами и арсайзами. Голова, что скажешь, всё работает, Благодарю :)

Skomopox

  • Освоившийся
  • **
  • Posts: 56
    • View Profile
Re: Рандом!
« Reply #7 on: September 18, 2014, 10:53:51 AM »
Блин, чёго-то я потопился. Не прочитал, как следует последнее и это последнее не понял. У меня не работает. В общем я первым вариантом делаю, и где у тебя написано, обрабатываем, как надо я вставляю lclick($px[$r],$py[$r]). Первый раз кликает, как надо, но на второй цикл пишет, ошибка инертпретации и просить остановить сценарий. Т.е. она как не скидывает их потомю Я бы что-нибудь исправил, но я там нифига не понимаю :) И да. За место $arr я просто поставил свои $p? Просто $p.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Рандом!
« Reply #8 on: September 18, 2014, 11:01:49 AM »
Покажи целиком. ХЗ что ты там наменял.


Skomopox

  • Освоившийся
  • **
  • Posts: 56
    • View Profile
Re: Рандом!
« Reply #9 on: September 18, 2014, 01:18:37 PM »
Убегал просто.

Code: (clickermann) [Select]
$i=0
for($i, $i<20)
   arrpush($p,$i)
end_cyc

for($j,$j<8)
   $r=rnd(0,arrsize($p)-1)
   print(("RND= ",$p[$r])
   lclick($px[$r],$py[$r])
   waitms(rnd($t1,$t2))
   for($i=$r+1,$i<arrsize($p))
      $p[$i-1]=$p[$i]
   end_cyc
   $empty=arrpop($p)
end_cyc

Вот первый раз она отлично ставит, а второй не идёт. Т.е. у меня цикл. Один раз выбирает  8 чисел, потом еще и еще и т.д.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Рандом!
« Reply #10 on: September 18, 2014, 01:47:21 PM »
Что такое $px, $py ? Где эти массивы?
Если это то что я думаю, то какой смысл в этой задаче делать неповторяемость выбора?
« Last Edit: September 18, 2014, 01:49:25 PM by Vint »


Skomopox

  • Освоившийся
  • **
  • Posts: 56
    • View Profile
Re: Рандом!
« Reply #11 on: September 19, 2014, 03:08:03 AM »
Твои случайные числа от 0 до 19, так как нумерация в массиве идёт с нуля.
+1 в строке "ARRPUSH($arr, $i+1)" не для красоты был
Да с +1 я разобрался. Это я понимаю. Поэтому и убра его. Он мне не нужен. от 0 до 19 пойдёт.

UNDEFINE ($аar) очищает массив, так же как и переменную, при работе циклов об этом лучше не забывать.
Но и при простом зацикливании на точку всё вполне работоспособно.
И где в твоём коде undefine? Я просто не понимаю куда его там вставить? И lclick там самое важное из всего.

Skomopox

  • Освоившийся
  • **
  • Posts: 56
    • View Profile
Re: Рандом!
« Reply #12 on: September 19, 2014, 03:13:07 AM »
Что такое $px, $py ? Где эти массивы?
Если это то что я думаю, то какой смысл в этой задаче делать неповторяемость выбора?

Массивы эти прописаны в самом начале скрипта:
$px[0]=234
$py[0]=167
...
$px[19]=589
$py[19]=347

Суть в том, что мне нужно, выбрать любое рандомное число и кликнуть по уже заданным координатам. Но должны быть 8 разных чисел. Соответственно 8 разных мест для клика. Как-то так :)

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Рандом!
« Reply #13 on: September 19, 2014, 08:26:57 AM »

Массивы эти прописаны в самом начале скрипта:
$px[0]=234
$py[0]=167
...
$px[19]=589
$py[19]=347

Суть в том, что мне нужно, выбрать любое рандомное число и кликнуть по уже заданным координатам. Но должны быть 8 разных чисел. Соответственно 8 разных мест для клика. Как-то так :)
Вот так понятно. Тогда ты пишешь неправильно. Нужно
Code: (clickermann) [Select]
lclick($px[$p[$r]],$py[$p[$r]])
« Last Edit: September 19, 2014, 08:45:33 AM by Vint »


Skomopox

  • Освоившийся
  • **
  • Posts: 56
    • View Profile
Re: Рандом!
« Reply #14 on: September 20, 2014, 04:01:04 PM »
Игорь, почему-то не работает! Точнее этот вариант, который ты написал с кликом работает, но рандом нет. по несколько раз в одну и ту же точки долбит.