mt_rand介于1和4之间,但从不连续两次

时间:2014-12-15 22:38:38

标签: for-loop random numbers generated

我试图获得一个随机数:1,2,3或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,每次悬停一个部分时,调用该函数并触发图像改变,但如果它返回两次相同的数字,它看起来好像是&# 39;不工作。

5 个答案:

答案 0 :(得分:2)

对于这种复杂的事情,你不需要mt_rand

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

现在他们永远不会是一样的。

答案 1 :(得分:0)

您可以存储最后一个结果并在while循环上循环遍历mt_rand,直到它提供与先前结果不同的内容。请注意,这意味着如果运气不好,可能需要一段时间来提取新号码。

确保程序终止的另一个解决方案是存储以前的结果,生成一个没有先前值的选项列表,并使用array_rand在此列表中随机取一个数字。但它假设存在少量随机可能性。

答案 2 :(得分: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;
  ...

答案 3 :(得分: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;
}

答案 4 :(得分: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>