2014-12-15 2 views
0

Я пытаюсь получить случайное число: 1, 2, 3 или 4, но как я могу заставить его никогда не возвращать одинаковое число дважды подряд.mt_rand между 1 и 4, но никогда один и тот же дважды подряд

function largeplate() { 
    $('.hero.largeplate').css({"background-image":"url(<?php echo get_bloginfo('template_directory');?>/images/hero/largeplate-" + mt_rand(1, 4) + ".png)"}); 
}; 
function mediumplate() { 
    $('.hero.mediumplate').css({"background-image":"url(<?php echo get_bloginfo('template_directory');?>/images/hero/mediumplate-" + mt_rand(1, 4) + ".png)"}); 
}; 

<svg version="1.1" baseProfile="basic" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1400 748" xml:space="preserve"> 
<path id="largeplate" onmouseover="largeplate();" style="opacity:0;fill:#FFFFFF;" d="M66.785,745.854c-4.209-21.595-8.774-52.639-9.001-90.009 c-1.378-226.627,158.584-388.207,202.253-429.179c46.677-43.793,191.583-166.611,414-176c46.574-1.966,241.48-5.076,420,134.667 c166.267,130.151,234.259,318.415,244,466c2.623,39.737,0.779,72.842-1.333,95.333L66.785,745.854z"/> 
<path id="mediumplate" onmouseover="mediumplate();" style="opacity:0;fill:#FFFFFF;" d="M124.704,746.667c-1.252-7.876-2.831-19.121-4-32.667 c-13.967-161.797,61.447-292.434,96.667-344.667C290.895,260.294,384.142,203.909,430.038,180 c53.978-28.119,168.826-77.147,317.333-64c219.724,19.452,351.781,160.728,374.667,186c148.734,164.246,148.901,356.341,148,397.333 c-0.889,15.778-1.778,31.556-2.667,47.333H124.704z"/> 
</svg> 

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

+2

Примите '' array_rand' из диапазона (1,4) 'для двух элементов? В качестве однострочного: '$ two_numbers = array_rand (array_flip (range (1,4)));' ('array_flip - это потому, что' array_rand' возвращает ключи) –

+1

Вы вызываете 'mt_rand()' в контексте JavaScript вместо PHP. –

+0

@ Ja͢ck у него есть теги Interrobang

ответ

0

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

c=[]; 
function makeUniqueRandom(d){ 
    if(!c.length){ 
     for(var e=1;e<d;e++){ 
      c.push(e) 
     } 
    } 
    c.splice(Math.floor(Math.random()*c.length),b=c[e],1); 
    return b 
}; 

function randomizeBackground() { 
    $('.elementA').css({ "background-image":"url('/images/image-" + makeUniqueRandom(4) + ".png)" }); 
} 

<div class="elementA" onmouseover="randomizeBackground();"></div> 
2

Для этого не требуется mt_rand.

$plateBackgroundVariants = [1,2,3,4]; 
shuffle($plateBackgroundVariants); 
// use $plateBackgroundVariants[0] for the "large" link 
// use $plateBackgroundVariants[1] for the "medium link 

Теперь они никогда не будут такими же.

0

Вы можете сохранить последний результат и цикл через mt_rand в цикле while, пока он не даст что-то иное, чем предыдущий результат. Остерегайтесь, это означает, что с очень неудачей может потребоваться время, чтобы вытащить новый номер.

Другим решением, гарантирующим завершение программы, является сохранение предыдущего результата, создание списка ваших вариантов без предыдущего значения в нем и случайное число в этом списке с использованием array_rand, например. Но он предполагает, что существует небольшое количество случайных возможностей.

+0

Knuth shuffle прекрасно работает здесь. –

0

Вы можете написать обертку mt_rand() используя static переменные для отслеживания предыдущего значения:

function my_rand ($min, $max) 
{ 
    static $prev = NULL; 

    do { 
    $r = mt_rand ($min, $max); 
    } while ($r === $prev); 

    $prev = $r; 

    return $r; 
} 

Обратите внимание, что эта функция будет входить в бесконечный цикл, если $min === $max. Вы можете защитить от этого. Например:

function my_rand ($min, $max) 
{ 
    if ($min === $max) 
    return $min; 
    ... 
+0

Thanx, который был полезен – Jim

0

Чтобы архивировать это, вам нужно будет где-то сохранить последнее значение, чтобы вы не использовали его снова.

Кроме того, чтобы не рассчитывать на удачу, если существует последнее число, вы должны уменьшить $ max в одном, поэтому у вас всегда есть новый номер за один ход, пропуская последний.

Что-то вроде этого:

function example_rand($previous = null) 
{ 
    if($previous === null) 
     $number = mt_rand(1, 4); 
    else 
    { 
     $number = mt_rand(1, 3); 
     if($number >= $previous) 
      $number++; 
    } 

    return $number; 
}