我有一个 PHP 脚本,它需要随机化一个具有一致结果的数组,因此它可以向用户显示前几项,然后他们可以根据需要从相同的随机集合中提取更多结果。
我目前使用的是这个(我相信基于 Fisher Yates 算法):
function shuffle(&$array, $seed)
{
mt_srand($seed);
for ($a=count($array)-1; $a>0; $a--) {
$b = mt_rand(0, $a);
$temp = $array[$a];
$array[$a] = $array[$b];
$array[$b] = $temp;
}
}
这在我的本地安装上运行良好,但它需要运行的服务器安装了 Suhosin,它覆盖了 mt_srand,这意味着种子被忽略,数组只是随机打乱,用户得到重复的结果。
我在 Google 上发现的所有内容都表明我需要禁用 suhosin.mt_srand.ignore(和 suhosin.srand.ignore,但不确定后者是否相关)所以我将以下内容放入 .htaccess:
php_flag suhosin.mt_srand.ignore Off
php_flag suhosin.srand.ignore Off
我无法访问此服务器上的 php.ini,所以据我所知,这是我唯一能做到的方法。问题是它没有效果 - phpinfo() 仍然将两个设置显示为打开,而我可以使用 .htaccess 更改其他 Suhosin 设置没问题。
所以我想我正在寻找的是一种实际禁用 suhosin.mt_srand.ignore 的方法(或者它不起作用的原因),或者是一种从 PHP 中播种随机数生成器的解决方法。还是我必须自己实现另一个 RNG?
任何帮助将不胜感激。谢谢!
最佳答案
使用一些基本的数学和一些技巧,您可以很容易地创建自己的随机函数,就像我刚刚做的那样:)
抱歉,我还没有清理它。在类里面会好得多,因为你可以避免用以前的种子重新播种它的需要。不要使用静态变量,因为它限制您一次只能使用 1 个种子(或您自己手动跟踪种子)。 OOP 会解决这个问题。用下面的函数做你喜欢的事,但如果你重写它,请告诉我。
/**
* returns a decimal between 0 and max_number, requires seeding every time and will ALWAYS return the same decimal for the same seed
* @copyright scott thompson, all rights reserved
* @license MIT (do what you like with this)
* @param string $seed
* @param int $max_number=100 adjust the maximum number range
*/
function random_number($seed, $max_number = 100) {
//make sure there won't be any deadspace where random numbers will never fill
if ($max_number > 0xFFFFFF) {
trigger_error("Max random number was to high. Maximum number of " . 0xFFFFFF . " allowed. Defaulting to maximum number.", E_USER_WARNING);
$max_number = 0xFFFFFF;
}
//hash the seed to ensure enough random(ish) characters each time
$hash = sha1($seed);
//use the first x characters, and convert from hex to base 10 (this is where the random number is obtain)
$rand = base_convert(substr($hash, 0, 6), 16, 10);
//as a decimal percentage (ensures between 0 and max number)
return $rand / 0xFFFFFF * $max_number ;
}
$seed = 'hello';
print ($seed = random_number($seed)) . '<br />'; //66.779748605475
print ($seed = random_number($seed)) . '<br />'; //3.5753311857779
print ($seed = random_number($seed)) . '<br />'; //13.994396567011
print ($seed = random_number($seed)) . '<br />'; //70.344917198713
print ($seed = random_number($seed)) . '<br />'; //4.5583250855401
希望这有帮助,斯科特
关于php - suhosin.mt_srand.ignore 在 PHP 中持续随机排列数组的解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9482290/
前置步骤我们都操作完了,这篇开始介绍jenkins的集成。话不多说,看操作1、登录进入jenkins后会让你选择安装插件,选择第一个默认的就行。安装完成后设置账号密码,重新登录。2、配置JDK和Git都需要执行路径,所以需要先把执行路径找到,先进入服务器的docker容器,2.1JDK的路径root@69eef9ee86cf:/usr/bin#echo$JAVA_HOME/usr/local/openjdk-82.2Git的路径root@69eef9ee86cf:/#whichgit/usr/bin/git3、先配置JDK和Git。点击:ManageJenkins>>GlobalToolCon
我正在尝试使用Sinatra中的重定向和session在网站周围传递一些数据。这是一个简化的示例,使用PrettyPrint进行调试:require'pp'require'rubygems'require'sinatra'enable:sessionsget'/'dosession[:foo]='12345'puts'session1'ppsessionredirectto('/redir')endget'/redir'doputs'session2'ppsession'helloworld'end查看Thin的输出,我看到:>>Listeningon0.0.0.0:4567,CTRL
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它
TL;DR:IneedtogetthedifferencebetweenHH:MM:SS.msandHH:MM:SS.msasHH:MM:SS:ms我需要什么:这是一个棘手的问题。我正在尝试计算两个时间戳之间的差异,如下所示:In:00:00:10.520Out:00:00:23.720应该交付:Diff:00:00:13.200我想我应该将时间解析为实际的Time对象并在那里使用差异。这在前一种情况下效果很好,并返回00:0:13.200。什么不起作用:然而,对于某些人来说,这并不能正常工作,因为Ruby使用usec而不是msec:In:00:2:22.760Out:00:2:31.
我很困惑如何做到这一点。我需要获取一个日期时间对象,并获取当前时间的持续时间(以小时、天等为单位)。谢谢。 最佳答案 获取以秒为单位的持续时间很容易:>>foo=Time.new=>MonDec2918:23:51+01002008>>bar=Time.new=>MonDec2918:23:56+01002008>>printbar-foo5.104063=>nil所以,五秒多一点。但要以更人性化的形式呈现它,您需要第三方添加,例如time_period_to_s,或Duration包。
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我使用PHP的时间太长了,对它感到厌倦了。我也想学习一门新语言。我一直在使用Ruby并且喜欢它。我必须在Rails和Sinatra之间做出选择,那么您会推荐哪一个?Sinatra真的不能用来构建复杂的应用程序,它只能用于简单的应用程序吗?
我很确定Ruby有这些(等同于__call、__get和__set),否则find_by将如何在Rails中工作?也许有人可以举一个简单的例子来说明如何定义与find_by相同的方法?谢谢 最佳答案 简而言之你可以映射__调用带有参数的method_missing调用__设置为方法名称以'='结尾的method_missing调用__获取不带任何参数的method_missing调用__调用PHPclassMethodTest{publicfunction__call($name,$arguments){echo"Callingob
Lisp是否适合Web编程/应用程序(交互式),就像ruby和php一样?需要考虑的事情是:易于使用可部署性难度(尤其是对于编程初学者而言)(编辑)在阅读PaulGraham'sessay之后,我特别提到了CommonLisp.将是我的第一门编程语言。在这方面。这样做合适吗?我听说Clojure的宏功能不如CommonLisp的强大,这就是我尝试学习Clojure的原因。它教授编程并且非常强大。 最佳答案 Lisp是一个语系,而不是单一的语言。为了稍微回答您的问题,是的,存在用于各种Lisp方言的Web框架,例如用于Common
项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于微信校园跑腿小程序系统,前台用户使用小程序发布跑腿任何和接跑腿任务,后台管理使用基于PHP+MySql的B/S架构;通过后台管理跑腿的用户、查看跑腿信息和对应订单。意义:手机网络时代,大学生通过手机网购日常用品、外卖外卖、代取快递等已不再是稀奇的事情。此外,不少高校还流行着校园有偿工作,校园跑腿就成了大学生创业服务项目。 因为你在校园里,所以不会有进入的限制。并不是所有的外卖平台都可以随意进入校园,比如小黄和小蓝的双打外卖平台。许多大学禁止送餐进入学校,更不用说送餐进入宿舍了。这一措施使得校园服务市场的竞争相对不
前言 前端时间PHP项目部署升级需要,需要把Laravel开发的项目部署K8s上,下面以laravel项目为例,讲解采用yaml文件方式部署项目。一、部署步骤1.创建Dockerfile文件Dockerfile是一个用来构建镜像的文本文件,在容器运行时,需要把项目文件和项目运行所必须的组件安装其中。#基础镜像FROMphp:7.4-fpm#时区ARGTZ=Asia/Shanghai#更换容器时区RUNcp"/usr/share/zoneinfo/$TZ"/etc/localtime&&echo"$TZ">/etc/timezone#替换成阿里apt-get源RUNsed-i"s@http