PHP rand()...得到真正的50/50结果?

JD *_*cks 8 php

我想运行一个有两种不同结果的函数,但我希望每个结果真正达到50%.我假设兰德(0,1)是要走的路,但我很好奇,如果这可能有利于一个而不是另一个.获得50/50结果的最佳方法是什么?

谢谢.

编辑:谢谢你们,我不希望它是随机的,我希望结果是101010101而不是111001101.也许我应该用最后一个值输出更新数据库然后返回相反的?

EDIT2:好的,对不起,我的上次编辑有误导性.我只是为每个用户调用一次函数,并将该值作为cookie分配给用户.我希望每个访问用户在订单1010101中收到1或0.

Óla*_*age 30

在PHP中mt_rand()是一个更好的随机数生成器

mt_rand(0,1);
Run Code Online (Sandbox Code Playgroud)

足够了,应该产生相当不错的50/50值.

引用关于mt_rand:

许多旧libcs​​的随机数生成器具有可疑或未知的特征并且速度很慢.默认情况下,PHP使用带有rand()函数的libc随机数生成器.mt_rand()函数是替代它的替代品.

它使用具有已知特征的随机数发生器,使用»Mersenne Twister,它将产生比平均libc rand()提供的速度快四倍的随机数.

比尔有一个关于视觉例子的良好链接.我不知道用户在PHP中使用了什么PHP,但是因为他包含了我在我的服务器上托管的代码(Linux with PHP 5.1.6)


Bil*_*ard 10

对编辑过的问题的回答:如果你想保持50%的精确比例,那么随机性是你想要的最后一件事.为了您的目的,您可能只想为每个新用户(未检测到cookie)分配数据库中的自动编号,然后给偶数用户的一页和奇数用户的另一页(如评论中的RobS建议).

if( ($user_id % 2) == 0 )
    // user id is even
else
    // user id is odd
Run Code Online (Sandbox Code Playgroud)

原始答案: PHP的rand()函数不是一个特别好的伪随机数生成器(参见一个简单的可视化示例).我推荐使用mt_rand().


Joh*_*sch 2

根据您将使用此数字的特定上下文(例如,每个用户的基础、应用程序的生命周期等),您可以将其存储在多个位置、$_SESSION、数据库值中,或者如果范围仅涵盖当前页面,然后您可以直接将其保存在该页面的代码中。

切换该值的一个简单方法是:

$val = 1 - $val;
Run Code Online (Sandbox Code Playgroud)

对于数据库调用:

UPDATE YourTable SET `next_value` = 1 - `next_value`
Run Code Online (Sandbox Code Playgroud)

ETC...