如何从文本中获取随机数?
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。
有可能吗?
答案 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
编辑:已更新,您希望每分钟/最大值缓存。