【问题标题】:PHP: rand() or array_rand trouble [closed]PHP:rand()或array_rand麻烦[关闭]
【发布时间】:2015-09-06 22:37:20
【问题描述】:

result2.txt 中的结果每 ~100 个字符串重复一次。 是的,相同的姓氏和相同的 rand(100000, 999999) 结果每 100 个值循环一次

NetBeans 8.0.2

//Get surname
$famtxt = file('surname.txt');
$surname = $famtxt[ array_rand($famtxt) ]; 
unset($famtxt); 

//Results
$result0=$surname.' '.rand(100000, 999999);                               
$resulttxt = fopen('result2.txt', 'a');
fwrite($resulttxt,$result0); 

【问题讨论】:

  • @DeDee 听起来 OP 说他的“随机”结果每 100 个值左右循环一次,这通常不是您在生成随机数时想要的。
  • @Ярослав 好的,您能否以任何方式稍微修改您的问题,以便我可以删除我的反对票?
  • @DeDee,完成。对不起,我的英语不太好,但不知道比stackoverflow更好的网站
  • 我刚刚执行了for ($i=1; $i<=10000; $i++) echo rand(100000, 999999)."<br />",10000 个结果中只有 45 个是重复的。
  • @DeDee 使用 mt_rand(100000, 999999);相反,您将在 10000 个中得到 0 个重复项:p ++$i 也比 $i++ 快。不,php 不够聪明,无法为您自动优化(与大多数其他语言不同) - 这是一个测试脚本 - pastebin.com/11qJu0k7

标签: php random


【解决方案1】:

永远不要使用rand,那里有更好的功能,即

http://php.net/manual/en/function.random-int.php

生成适合使用的加密随机整数 公正的结果至关重要(例如洗牌扑克牌)。

http://php.net/manual/en/function.mt-rand.php

旧版 libcs​​ 的许多随机数生成器具有可疑或未知的 特点和速度慢。默认情况下,PHP 使用 libc 随机 带有 rand() 函数的数字生成器。 mt_rand() 函数是一个 直接替换这个。 它使用随机数生成器 使用 » Mersenne Twister 的已知特征,这将 产生随机数的速度比一般的 libc 快四倍 rand() 提供。

(强调由我添加)速度是一个不错的奖励,但它使用MT 会给你“随机”的数字,而不仅仅是rand

【讨论】:

  • Ty,但仍然循环结果
  • “还是循环结果”,是 mt_rand() 循环结果吗?你是怎么得出这个结论的?你如何测试这个?
  • 在这里写了一个测试脚本,在 100 万次迭代中,它似乎在我的结果中没有任何循环(在 100000, 999999 范围内有 10 次和 9 次的几个数字) - 你呢? pastebin.com/11qJu0k7
  • @hanshenrik,伙计,但我的 NetBeans IDE 非常棒
【解决方案2】:

哇! 这只是一个可怕的 NetBeans IDE 8.0.2 与伪随机生成器的问题。 脚本在服务器上运行良好

【讨论】:

  • 没有。你在你的开发计算机上使用了一个糟糕的 libc 和一个糟糕的 rand(也许是微软的 msvcrt?),而你正在使用的服务器有一个很好的 libc 和一个很好的 rand()。
  • @hanshenrik,你觉得我的 libc 这么差吗? :/所以,你可以建议做什么?我喜欢 NetBeans IDE,我不想离开它:с
  • 问题不是 NetBeans,而是它从你的操作系统(windows XP?windows 7?Mac?Mac OS X?Linux?不管它运行什么)加载的 c 运行时。)对我来说,它从 Windows 7 x64 SP1 上的 C:\Windows\syswow64\msvcrt.dll 加载 c 运行时和 rand()
  • 重点是,您计算机上的 c 运行时库,可能对 rand() 的实现不好(您可能使用的是 windows XP 吗?:p)
  • @hanshenrik C 运行时库破坏了我的 PHP 工作 - 哦,我非常喜欢编程!!!我使用 x64 Win8,可以找到 msvcrt.dll,但我需要用它做什么?更新?删除?改写? ;) 我想我需要这个 libc 的最新版本,但它在哪里?
猜你喜欢
  • 1970-01-01
  • 2019-02-14
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多