- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
前阵子我写了一个随机字符串生成器,它使用字符串中的第 mt_rand() 个字符构建一个字符串,直到达到所需的长度。
public function getPassword ()
{
if ($this -> password == '')
{
$pw = '';
$charListEnd = strlen (static::CHARLIST) - 1;
for ($loops = mt_rand ($this -> min, $this -> max); $loops > 0; $loops--)
{
$pw .= substr (static::CHARLIST, mt_rand (0, $charListEnd), 1);
}
$this -> password = $pw;
}
return $this -> password;
}
(CHARLIST 是一个包含密码字符池的类常量。$min 和 $max 是长度限制)
今天,在研究完全不同的东西时,我偶然发现了以下代码:
function generateRandomString ($length = 10) {
return substr(str_shuffle ("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, $length);
}
这与我在一行中基于循环 mt_rand() 的代码实现的效果几乎相同。我真的很喜欢它,原因很简单,代码行数越少越好。 :)
但是当我在 PHP 手册中查找 str_shuffle 时,它的文档非常简单。我非常想知道的一件事是它使用什么算法来实现随机性?该手册没有提到进行什么样的随机化来获得打乱的字符串。如果它使用 rand() 而不是 mt_rand() 那么坚持我当前的解决方案毕竟可能会更好。
所以基本上我想知道 str_shuffle 如何随机化字符串。它是使用 rand() 还是 mt_rand()?我正在使用我的随机字符串函数生成密码,因此随机性的质量很重要。
更新:正如已经指出的那样,str_shuffle 方法不等同于我已经在使用的代码,并且由于字符串的字符与输入保持相同,所以随机性会降低,只是他们的顺序改变了。但是,我仍然很好奇 str_shuffle 函数如何随机化其输入字符串。
最佳答案
更好的解决方案是 mt_rand
,它使用 Mersenne Twister哪个更好。
As has been pointed out, the str_shuffle method is not equivalent to the code I'm already using and will be less random due to the string's characters remaining the same as the input, only with their order changed. However I'm still curious as to how the str_shuffle function randomizes its input string.
要使输出相等,我们只需使用 0,1
并查看每个函数的可视化表示
简单的测试代码
header("Content-type: image/png");
$im = imagecreatetruecolor(512, 512) or die("Cannot Initialize new GD image stream");
$white = imagecolorallocate($im, 255, 255, 255);
for($y = 0; $y < 512; $y ++) {
for($x = 0; $x < 512; $x ++) {
if (testMTRand()) { //change each function here
imagesetpixel($im, $x, $y, $white);
}
}
}
imagepng($im);
imagedestroy($im);
function testMTRand() {
return mt_rand(0, 1);
}
function testRand() {
return rand(0, 1);
}
function testShuffle() {
return substr(str_shuffle("01"), 0, 1);
}
输出testRand()
输出testShuffle()
输出testMTRand()
So basically I'd like to know how str_shuffle randomizes the string. Is it using rand() or mt_rand()? I'm using my random string function to generate passwords, so the quality of the randomness matters.
您可以清楚地看到 str_shuffle
产生与 rand
几乎相同的输出 ...
关于php - str_shuffle 和随机性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14079703/
我试图影响 Z3 生成的模型值结果的随机性。据我所知,这方面的选择非常有限:在线性算术的情况下,单纯形求解器不允许仍然满足给定约束的随机结果。但是,有一个选项 smt.arith.random_ini
我需要从表中获取一些数据并通过两个参数对它们进行排序。参数之一是 RAND(),因为记录需要是随机的。我有一个很大的数据库,使用 RAND() 会大大降低性能,我想避免它。是否有机会优化随机排序的性能
所以我尝试将 Boost.Random mt19937 生成器与模板一起使用。我的 c++ 有点生疏,但据我所知(和文档一样,Boost 的文档也很模糊)它应该采用一个模板参数来指定它的返回类型(fl
我正在尝试为家庭作业编写一个遗传算法来解决旅行商问题。 我正在尝试的变异函数之一是在游览中使用 random.shuffle。 当我阅读 random.shuffle 的文档时,我看到: shuffl
尝试创建随机 (0/1) boolean 操作。我设置了一个多维数组。到目前为止,一切正常。我在正确的道路上吗?我目前使用递归;有没有更有效的方法来做到这一点? function randomMove
我想在每天下午 1 点到 2 点之间的随机时间运行一个云函数。我使用 Cloud Scheduler (cron) 将消息发布到触发该功能的 PubSub。我想在 Cloud Scheduler 端实
我想在每天下午 1 点到 2 点之间的随机时间运行一个云函数。我使用 Cloud Scheduler (cron) 将消息发布到触发该功能的 PubSub。我想在 Cloud Scheduler 端实
这可能是一个相当愚蠢的问题。我想知道在 Swift 中使用 arc4random_uniform 是否可以实现不同的细微差别/随机性程度。这是一个例子: let number = arc4random
我正在开发一部分代码,其中我必须使用日历 API 使用现有的 api,而我使用的是全新的 API。在转换中出现了一些奇怪的行为,请看这个例子: SimpleDateFormat df = new Si
我是一名优秀的程序员,十分优秀!