2013-06-06 6 views
0

Я пишу игру на PHP. В массиве от 0 до 51 содержится 52 элемента. Цель состоит в том, чтобы создать случайный список каждый раз, когда он уникален из предыдущего списка. Так что в первом списке в следующем нет шаблона последовательности. Например, если в первом списке есть шаблон, содержащийся как 7654, мы не хотим, чтобы в следующем списке сразу появился шаблон 7654.PHP: Случайный список из 52, поэтому, когда он повторяется, он уникален из предыдущего списка?

Правило состоит в том, что первый элемент списка и последний элемент не могут быть начальным и конечным элементами из предыдущего списка. Например, если первый список начинается и заканчивается:

0 
... 
51 

Не хочет, чтобы следующий список, чтобы начать с 51 и заканчивается 0.

Я думал о том, как подойти к этому. Я знаю о функции shuffle в PHP, но каждый раз, когда он генерирует случайный список, он не знает предыдущего списка. Опять же, списки должны быть уникальными непосредственно из предыдущего списка, а не из любого другого списка, который он генерирует для игрока.

Общая цель состоит в том, что каждый список не имеет отношения или общего шаблона к его предыдущему списку.

Я не знаю, есть ли название для этих случайных списков.

Как это можно сделать на PHP? Благодаря!

Можете ли это сделать, используя случайный метод, который использует различный «семенной» номер при каждом рандомизации списка?

Последовательность шаблонов - 4. Таким образом, если в предыдущем списке появился 7654, тогда новый список не может содержать 7654.

+0

Карточная игра за шанс? – Pudge601

+0

Не карты. У этого только 52 элемента. – Edward

+0

Не уверен, что именно вы просите в этом, похоже, существует более одного ограничения .. или я не понимаю ваше объяснение. – Pudge601

ответ

1

Я думаю, что у меня есть решение, которое должно работать для удовлетворения этих ограничений.

function nextList($last) { 
    $index = rand(1,50); // don't select first or last elements 
    $out = array(); 
    do { 
     list($value) = array_splice($last, $index, 1); 
     $out[] = $value; 
     $maxLoop = count($last); 
     do { 
      $newIndex = array_rand($last); 
     } while ($newIndex == $index && --$maxLoop); 
     $index = $newIndex; 
    } while (count($last) > 1); 
    $out[] = $last[0]; 

    return $out; 
} 

Используется следующим образом:

$first = range(0, 51); 
shuffle($first); 
$second = nextList($first); 
$third = nextList($second); 
// etc. 

Это работает на том основании, что для каждого элемента добавляет новый массив, она не исходила от того же элемента, исходящим его в последнем массиве ,

Например, если последний массив имел, где значения 43,12,13..., и мы добавим элемент 43 в новый массив, то мы гарантируем, что следующий элемент является любой элемент КРОМЕ12. С этой логикой невозможно получить одни и те же повторяющиеся последовательности.

Он также гарантирует, что первый элемент не является ни первым, ни последним элементом последнего массива, однако сделать это ограничение также для последнего элемента массива было бы намного сложнее.

EDIT

Я был фактически в состоянии использовать функцию check дал в ответ Hendriq, чтобы проверить, работает ли это решение, и, кажется, всегда возвращает действительный новый список, который не содержит последовательность из последнего array =]

+0

Отличная работа, отлично работает! – Edward

1

Ну есть небольшая проблема с предположениями у вас есть

Правило 1

The overall goal is that each list has no relationship or common pattern to it's previous list.

Правило 2

The rule is that the first element of the list and the last element can't be the start and end elements from the previous list.

Те два противоречат друг другу. Во-первых, не может быть никаких отношений, поэтому случайных. Итак, как вы сказали, тасовать (не смотрел, я принимаю ваше слово). Но второй должен знать о предыдущем. Что противоречит вашему предыдущему правилу.

Но вы можете сделать первый и последний элемент предыдущего розыгрыша (предыдущие 52). Затем вы перетасовываете текущую ничью. Если первый и/или последний элементы совпадают, нарисуйте еще раз, пока не будет найдено совпадение.

Также я думаю, что слово для этого полуслучайно.

Посмотрите на do{ }while(); на свой счет.

После того, как в комментарии не было одного и того же 4 элемента после друг друга, пришла следующая часть.

Что вам нужно, это способ идентификации элементов, так что давайте предположим, каждый «элемент» имеет идентификатор (для целей примера я использую только 5 элементов)

Позволяет использовать следующие

array(
    0 => array('id' => 1,), 
    1 => array('id' => 2,), 
    2 => array('id' => 3,), 
    3 => array('id' => 4,), 
    4 => array('id' => 5,), 
) 

Следующая ничья - это то же самое (только для цели). Что мы делаем, мы делаем массив идентификаторов, которые притягиваются:

array(
    0 => 1, 
    1 => 2, 
    2 => 3, 
    3 => 4, 
    4 => 5, 
) 

Затем использовать этот массив в следующей функции (не проверено, но должно дать вам правильный старт)

function check(array $prev, array $draw, $the_same = 4) { 
    $to_check = count($prev) - $the_same; 
    for($i = 0; $i < $to_check; $i++) { 
    if ($array_slice($prev, $i, $the_same) === array_slice($draw, $i, $the_same)) { 
     return false; 
    } 
    } 
    return true; 
} 

Что такое вы даете ему старый массив и тот, который вы нарисовали, и вы указываете номер с ним, с каким количеством событий может быть после eachother, что, возможно, одно и то же. Затем он просто начинает цикл и массивы, чтобы проверить, равны ли они.

+0

Я не очень хорошо объясняю это. В новом случайном списке не должно быть никаких четырех числовых шаблонов, найденных в предыдущем списке, и он не должен начинаться и заканчиваться тем же числом элемента, что и предыдущий список. Мне нужен какой-то метод грубой силы, чтобы продолжать «перетасовывать», пока он не получит то, что я ищу? – Edward

+0

Хорошо добавили вторую часть для этого сейчас – MKroeders