python随机数生成函数和时间_生成随机函数(与随机数相反)

我想创建一个函数,它接受一个字符串并返回一个介于0和1之间的数字。当给定相同的字符串时,函数应始终返回相同的数字,但结果不应具有可识别的模式。任何一组大的输入字符串的输出数都应该遵循均匀分布。在

此外,我需要生成多个这样的函数,即当给定字符串“abc”时,函数A可能始终返回0.593927,而函数B始终返回0.0162524。我需要它很快(这是一个数值模拟),并有相当好的统计数据。在

我使用的是Python,我将满足于以下形式的答案:“这是一种使用Python库实现的简单方法”或“这是一种可以实现的算法”。如果在Python中没有快速实现的方法,我就改为使用C。在

我意识到以下两种方法中的任何一种都会起作用,但每种方法都有缺点,这使我想寻找一种更优雅的解决方案。在存储字典

每次我得到一个新的字符串时,我就可以计算出一个新的随机数,并将其存储在字典中,以便再次收到相同的字符串时检索。但是我的应用程序可能会生成很多只出现一次的字符串,这最终将导致必须在内存中存储一个非常大的字典。这也使得重复性更加困难,因为即使我使用相同的种子,如果我以不同的顺序接收相同的字符串,我也会生成一个不同的函数。由于这些原因,最好是一致地“动态”计算随机数。

使用哈希函数

我可以对字符串调用一个散列函数,然后将结果转换为数字。生成多个函数的问题可以通过在每个输入字符串上附加一个“种子”字符串来解决。但是,那么我就只能尝试找到一个具有适当速度和统计信息的散列函数。Python内置的hash速度很快,但依赖于实现,我不知道统计数据会有多好,因为它不是为这种目的而设计的。另一方面,我可以使用一个安全的哈希算法,比如md5,它将有很好的统计信息,但这对于我的应用程序来说太慢了。针对数据存储应用程序的散列函数通常比md5之类的加密安全函数快得多,但它们的设计目的是避免冲突,而不是生成均匀分布的输出,而且这些函数并不一定在所有情况下都相同。

关于散列函数的进一步说明

为了说明避免冲突和生成统一结果是两回事,请考虑以下使用Python内置哈希函数的示例:>>> hash("aaa") % 1000

340

>>> hash("aab") % 1000

343

>>> hash("aac") % 1000

342

>>> hash("aad") % 1000

337

>>> hash("aae") % 1000

336

>>> hash("aaf") % 1000

339

>>> hash("aag") % 1000

338

>>> hash("aah") % 1000

349

>>> hash("aai") % 1000

348

>>> hash("aaj") % 1000

351

>>> hash("aak") % 1000

350

在上面的输出中没有碰撞,但是它们也明显不是均匀分布的,因为它们都在336和351之间,并且在第三位数也有一个确定的模式。我意识到,通过(hash("aaa")/HASH_MAX)*1000(假设我可以计算出HASH_MAX应该是什么)来获得更好的统计数据,但这应该有助于说明对一个好的散列函数的要求与我要寻找的函数的要求不一样。在

有关问题的一些相关信息

我不知道该算法需要处理的字符串是什么,因为字符串将由模拟生成,但可能会出现以下情况:他们将有一个非常有限的字符集(也许只有4或5个不同的符号)。

会有许多独特的或稀有的字符串和一些非常常见的,长度不同的字符串。

弦的长度没有上限,但是short可能比长的更常见。如果我从来没有看到一个超过100个字符的字符,我不会感到惊讶,但我不确定。其中很多只有一到三个字符,所以对于短字符串,算法的速度很重要。(但我想我可以用一个查找表来查找小于某个长度的字符串。)

通常情况下,字符串将有共同的大子字符串-通常两个字符串的区别只是在开始或结尾附加一个字符。重要的是,当字符串相似时,算法不会给出相似的输出值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值