0

1、2、3、または 4 の乱数を取得しようとしていますが、同じ数を 2 回続けて返さないようにするにはどうすればよいですか。

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 回返されると、機能していないように見えます。

4

5 に答える 5

2

mt_randこの複雑なものは必要ありません。

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

今、それらは決して同じではありません。

于 2014-12-15T22:41:52.577 に答える
0

それをアーカイブするには、最後の値をどこかに保存する必要があるため、再度使用することはありません。

また、最後の番号が存在する場合は、幸運を期待しないように、$max を 1 に減らす必要があります。これにより、最後の番号をスキップすることで、1 回の実行で常に新しい番号が得られます。

このようなもの:

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;
}
于 2014-12-15T22:56:56.093 に答える
0

最後の結果を保存し、前の結果とは異なる結果が得られるまで、while ループで mt_rand をループできます。これは、非常に運が悪いと、新しい番号を取得するのに時間がかかる可能性があることを意味することに注意してください.

プログラムの終了を確実にする別の解決策は、以前の結果を保存し、以前の値を含まない選択肢のリストを生成し、たとえば array_rand を使用してこのリストでランダムに数値を取得することです。ただし、少数のランダムな可能性があると想定しています。

于 2014-12-15T22:46:22.783 に答える
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;
  ...
于 2014-12-15T22:47:27.587 に答える