1

私は次のような配列を持っています:

$hex = array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f");

6つのランダムな要素を文字列として返したい(例:1a3564):

$random_color = array_rand($hex,6);

$ random_colorを内破することでうまくいくと思いました:

echo implode($random_color);

しかし、array_rand()は、この配列要素ではなく、親配列内の要素の位置を格納するため、次のようになります。

259111213の代わりに259bcd

私はこれが私が望むことを正確に行うことを知っています:

echo $hex[$random_color[0]];
echo $hex[$random_color[1]];
echo $hex[$random_color[2]];
echo $hex[$random_color[3]];
echo $hex[$random_color[4]];
echo $hex[$random_color[5]];

だが:

  • array_rand()内に配列要素を格納する方法はありますか?そもそも要素ではなく要素の位置を格納するのはなぜですか?

  • 私が達成したいことをするための最良の方法は何ですか?

  • array_rand()が最初の要素として文字を選択せず​​、2番目/ 3番目の要素として選択しないのはなぜですか(生成された色の99%は11111a 12345c 123456のように見えます)?

4

7 に答える 7

5

項目はすべて異なるため、値ではなくキーに変換しarray_randて、結果に使用できます。

implode('', array_rand(array_flip($hex), 6));

ただし、全体的な目標を達成するためのより良い方法があるかもしれません。たとえば、全体的な目標で数字の繰り返しが許可されている場合は、0から0xFFFFFFまでの乱数を生成し、16進文字列に変換します

dechex(mt_rand(0, 0xFFFFFF));
  1. そもそも要素ではなく要素の位置を格納するのはなぜですか?

    マニュアルページから:

    これは、配列からランダムなキーと値を選択できるようにするために行われます。

  2. array_rand()が最初の要素として文字を選択せず​​、2番目/ 3番目の要素として選択しないのはなぜですか(生成された色の99%は11111a 12345c 123456のように見えます)?

    array_randrandphp_rand、Cソースでは)を使用します。システムに応じphp_randrand、、、randomまたはlrand48rand特に貧弱な乱数ジェネレータです。

于 2012-01-13T14:21:58.017 に答える
5

ランダムな色は、より単純な方法で生成する必要があります。

printf('%02x%02x%02x',mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));

また

printf('%06x',mt_rand(0,16777215));

色を変数に保存する必要がある場合は、sprintf代わりにを使用してくださいprintf

于 2012-01-13T14:29:07.953 に答える
3

array_rand()ランダムに選択された要素のキーを返します(マニュアルの「戻り値」セクションを参照)。

期待どおりに機能させるには、を使用array_flip()してキーを取得します。

$random_color = array_rand(array_flip($hex), 6);

文字の最初の要素がほとんどない「奇妙な」結果については、IDEOne私のサーバーはこれらの結果を再現しているようです。私のオフィスで実行されているローカルマシン(まだDebianetch / PHP 5.2.9を実行している)は、意見が一致せず、からの要素を均等に分散し$hexているようです... PHPバージョンのもののようですか?

于 2012-01-13T14:22:11.187 に答える
2

配列の順序を維持する必要がない場合は、これをshuffle()$hexに置き換えることができます。このようなもの(コードパッドの例):

<?php
$hex = array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f");
shuffle($hex);
echo implode(array_slice($hex, 0, 6));
于 2012-01-13T14:22:47.987 に答える
2

あなたはこれを試してみてください:

$hex = array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f");
shuffle($hex);

echo sub_str(implode('',$hex),0,6);
于 2012-01-13T14:25:19.917 に答える
2

16進数のランダムな文字列が必要な場合は、次のようなこともできます。

substr(md5(time()),-6);

また

substr(md5(uniqid()),-6);

アレイをいじることなく、同様の結果が得られます。

于 2012-01-13T14:29:34.880 に答える
1

array_rand()内に配列要素を格納する方法はありますか?そもそも要素ではなく要素の位置を格納するのはなぜですか?

array_randのドキュメントによると、「値」ではなく「キー」の配列を返します。配列は連想配列ではないため、キーは数字です。あなたがする必要があるでしょう(テストされていない):

$result = "";
$random_color = array_rand($hex, 6);
foreach ($random_color as $randomIndex) {
  $result = $result . $hex[$randomIndex];
}

要素はそのアプローチで繰り返すことができないため、配列シャッフルまたはarray_randを使用しないでください。それはあなたがやろうとしていることではありません。

私が達成したいことをするための最良の方法は何ですか?

ランダムな色を生成する場合は、次を使用できます。

$color = '';
while(strlen($c) < 6) {
    $color .= sprintf("%02X", mt_rand(0, 255));
}

array_rand()が最初の要素として文字を選択せず​​、2番目/ 3番目の要素として選択しないのはなぜですか(生成された色の99%は11111a 12345c 123456のように見えます)?

乱数ジェネレーターを初期化する必要があるかもしれませんが、これは単なる推測です(この回答に対するTimurのコメントを参照してください)。

mt_srand((double)microtime()*1000000);
于 2012-01-13T14:30:09.813 に答える