【问题标题】:Random number from text seed来自文本种子的随机数
【发布时间】:2014-11-26 00:10:07
【问题描述】:

我正在尝试从字符串种子创建一个随机数,这是我尝试过的:

<?

function rand_n( $text )
{
  return fmod( hexdec( md5( $text ) ), 1000 ) + 1000;
}

for( $i=0; $i<=250; $i++ ) {
    $n = rand_n( "test$i" );
    $a[] = $n;
    echo $n . "\n";
}

echo "Total: " . count( $a ) . "\n";
$a = array_unique( $a );
echo "Unique: " . count( $a ) . "\n";

这有点工作,但它给了我很多重复。我尝试了其他方法,但他们给了我巨大的数字,我想将它保持在 4 或 5 数字结果。我知道使用 5 个字母可以生成比使用 5 个数字更独特的条目,但我的条目类似于 test0...250,它们不是那么随机。

如何使这个随机数生成器根据字符串种子返回唯一值,并将结果的长度保持在 4 或 5?

【问题讨论】:

  • 听起来你根本不想要随机数......你想要一个产生小整数的字符串的哈希函数。我会使用 FNV 之类的东西。

标签: php random numbers


【解决方案1】:

基数 36 到整数:

intval($str,36) 整数到 Base 36(或任何你想要的):

base_convert($val, 10, 36)

【讨论】:

    【解决方案2】:

    来自md5() 的十进制值无法正确表示;相反,您可以使用crc32() 为您提供一个 32 位整数值,然后您可以将其应用于:

    function rand_n( $text )
    {
      return crc32($text) % 1000 + 1000;
    }
    

    它产生 222 / 251 个唯一值,是原始代码的两倍多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-27
      • 2012-02-13
      • 2019-04-06
      • 1970-01-01
      • 2013-01-28
      • 2011-04-04
      • 2013-05-28
      相关资源
      最近更新 更多