在php中制作一个coinflip(可公平地说)

时间:2017-11-07 19:48:40

标签: php html css

所以我正在尝试使用coinflip系统创建网站(它只是我在空闲时间做的一个小项目)但我真的不知道从哪里开始。我需要在php(所以它在后端)中创建它,我需要它可证明是公平的(所以我可以证明它是合法的)。我发现的是我需要使用像sh256这样的东西,但我也听说过它很过时,很容易破解。此外,如果它重要,它是一个有蒸汽登录系统的网站,所以我计划能够加入1v1与其他蒸汽用户,而不仅仅是坐在我旁边的人或其他东西(不只是一个按钮就是我的意思嘿嘿)。

编辑:我搜索过它并尝试询问我认识的人等等,如果他们知道什么,但没有什么是好的。

提前致谢

-Eiríkur

2 个答案:

答案 0 :(得分:2)

这是获得随机抛硬币结果的简单方法:

from Tkinter import *
import Tkinter, Tkconstants, tkFileDialog
root = Tk()
root.filename = tkFileDialog.askopenfilename()

首先,我们制作一个数组,这将是我们的选择。 $result = array("heads", "tails")[random_int(0,1)]; 表示我们将始终获得这两个结果中的一个。接下来,在同一行中,我们可以选择一个元素来实际分配给我们之前创建的数组中的array("heads, "tails")变量。我们可以使用$result生成该数字。

  

注意:random_int(min, max)生成加密随机整数   适用于无偏差结果至关重要的情况,例如何时   为扑克游戏洗牌一副扑克牌。   http://php.net/manual/en/function.random-int.php

作为奖励,您可以向此数组添加更多元素,然后只需增加random_int()中的max值即可。你可以通过这样做来使这个更加动态:

random_int()

使用上面的代码,您可以拥有与您一样多的选择!

<强>测试

我运行了这个代码50,000次,这些都是我的结果。

$choices = ["heads", "tails", "Coin flew off the table"];
$result = $choices[random_int(0, count($choices)-1];

我运行此代码100,000次,这些是我的结果:

Array
(
    [heads] => 24923
    [tails] => 25077
)

你可以在这里玩,查看结果:

https://eval.in/894945

答案 1 :(得分:0)

在大多数情况下,以上答案可能是最好的。

在商业用途中,您可能需要确保可以重新计算结果以证明公平。

在以下代码中,您需要计算服务器的种子。此外,您可能还想创建一个用户可以看到的公共种子。这些可以是任何东西,但是我建议您使用某种hash。每次获得新结果时,只要增加回合数,它就会产生新的真正随机结果。

$server_seed = "96f3ea4d221ca1b2048cc3b3b844e479f2bd9c80a870628072ee98fd1aa83cd0";
$public_seed = "460679512935";

for($round = 0;$round < 10;$round++) {
    $hash = hash('sha256', $server_seed . "-" . $public_seed . "-" . $round);
    if (hexdec(substr($hash, 0, 8)) % 2) {
        echo 'heads', PHP_EOL;
    } else {
         echo 'tails', PHP_EOL;
    }
}

此代码将使用for loop循环10次,每次生成一个新结果。在代码中,我们将SHA256哈希分配给$hash变量。然后,我们可以使用PHP内置函数hexdec$hash计算十进制值。我们从十进制值中取余数,并根据它得出结果是否为0。

注意您可以使用这些值。将substring更改为substr($hash, 0, 14)将为您带来不同的生成结果的方式。请记住,这不会以任何方式改变最终结果。

1 000 000次跑步的平均结果如下:

Heads: 50.12%
Tails: 49.88%

您可以在here尝试上面的代码。