2010-06-21 74 views
1

如何从文本中获得随机数?文本到随机数

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
这可能吗?

+3

如果结果是确定性的,它怎么是一个随机数? – 2010-06-21 05:46:06

+0

'mt_rand(1,1001)'应该为'text1'返回不同于'mt_rand(1,1000)'的数字' – Qiao 2010-06-21 05:49:17

+1

@Qiao所以你真正的问题似乎是如何使用文本来生成RNG? – 2010-06-21 05:50:30

回答

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); 
} 

你如何基于文本计算种子是另一个问题。您可以将每个字符转换为整数并将其总和。你可以计算CRC32。你可以制作MD5并获得其中的一部分。这里有很多选择。

但是,真的,你为什么不直接使用某种CRC或MD5?

+0

新的问题,现在我会。但更像随机性。 – Qiao 2010-06-21 06:12:02

+1

MD5看起来随机:) CRC32也是如此。使用SHA512,没有人能从你得到的数字中猜出你的字符串。这正是那些散列算法的用途。 – vava 2010-06-21 06:24:17

+0

“如何根据文本计算种子是另一个问题。”不,这是OP问的确切问题。 – 2014-08-25 22:50:50

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 

编辑:更新,你想缓存每分钟/最大。

+0

'assertEqual($ rand1,text_to_number($ text1,1,1000)); // PSEUDOCODE assert' - 这是什么?我在哪里可以读到这个? – Qiao 2010-06-21 05:58:40

+0

这是伪代码(即不是真正的代码),只是表明重复调用应该是相同的。只要忽略它。 – 2010-06-21 06:01:08

+1

这个“缓存”只会在该脚本运行的时候存活。根据目的,这可能没有任何用处。 (另外,我认为你对全局变量的使用会导致这种情况被破坏) – 2010-06-21 06:01:42

6

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

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

这也是我的第一个想法,但你更好地执行了它。这比缓存更好。 – 2010-06-21 05:59:20

+0

散列+1。是的,这听起来像他所需要的 – Mawg 2010-06-21 06:10:55

1

你似乎在询问一个CRC。这种类型的函数计算一个数字形式的短散列(通常是32位),用于设计一个快速,相当可靠的方式来确定两个字符串是否不同。

crc32($string) 

这将返回-2147483648和2147483647

之间的值,以确保它落入0到999,尝试使用类似

abs(crc32($string)) % 1000 

当然,这降低了“随机性“的价值有点。

+0

非常简单的解决方案。 – 2010-06-21 06:02:57