文本到随机数

时间:2010-06-21 05:43:14

标签: php

如何从文本中获取随机数?

function text_to_number($text, $min, $max)
{
    ....
    mt_rand($min, $max);
    ....
    return $random_number;
}

$rand1 = text_to_number("text1", 1, 1000);
$rand2 = text_to_number("text2", 1, 1000);

因此“text1”始终在mt_rand(1, 1000)中返回476(例如),而“text2” - 始终为241。 有可能吗?

4 个答案:

答案 0 :(得分:6)

我会说忘掉“随机”,听起来你真正想要的是某种形式的哈希。这是一个简单的实现,它使用字符串的md5哈希值并使用模数将其缩放到您所需的范围内。

function text_to_number($text, $min = 0, $max = 1000)
{
  return fmod(hexdec(md5($text)), ($max - $min)) + $min;
}

答案 1 :(得分:5)

您要做的是根据您的字符串为随机生成器提供值。参见代码

mt_srand(5);
$value = mt_rand(1, 10);
无论您调用多少次,

始终会为$value分配相同的值。更好的是,对mt_rand的所有其他调用将从一次运行到另一次运行一致地返回相同的值(彼此不同),但您不应该关心它。

所以,你必须写

function make_seed($text) {
   //do seed calc
   return $seed;
}

function text_to_number($text, $min, $max) {
   mt_srand(make_seed($text));
   return mt_rand($min, $max);
}

如何根据文本计算种子是另一个问题。您可以将每个char转换为整数并对它们求和。你可以计算CRC32。您可以制作MD5并参与其中。这里有很多选择。

但实际上,为什么不直接使用某种CRC或MD5?

答案 2 :(得分:1)

您似乎要求 CRC 。这种类型的函数以字符串的形式(通常是32位)计算一个短哈希值,用于确定两个字符串是否不同的快速,相当可靠的方法。

crc32($string)

这将返回介于-2147483648和2147483647之间的值。

要确保它在0到999之间,请尝试使用

之类的内容
abs(crc32($string)) % 1000

当然,这会稍微降低价值的“随机性”。

答案 3 :(得分:0)

听起来你想要在给定字符串键时返回1到1000之间的随机数,但是每次获得相同的字符串键时都希望返回相同的“随机数”。

我的直观解决方案是哈希输入并根据它返回一个int。但是,更好的解决方案是缓存您的世代:

$cache = array();
function text_to_number($text, $min, $max) 
{ 
     if (!isset($cache[$text]))
         $cache[$text] = array();

     if (!isset($cache[$text][$min])
         $cache[$text][$min] = array();

     if (!isset($cache[$text][$min][$max])
         $cache[$text][$min][$max] = mt_rand($min, $max);

     return $cache[$text][$min][$max];
} 

$text1 = "text1"; 
$text2 = "text2"; 

$rand1 = text_to_number($text1, 1, 1000); 
$rand2 = text_to_number($text2, 1, 1000); 
assertEqual($rand1, text_to_number($text1, 1, 1000)); //PSEUDOCODE assert

编辑:已更新,您希望每分钟/最大值缓存。