【问题标题】:Making a coinflip in php (Provably fair)在 php 中进行硬币翻转(可证明是公平的)
【发布时间】:2020-04-16 20:15:57
【问题描述】:

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

编辑:我用谷歌搜索了它,并尝试询问我认识的人等他们是否知道任何事情,但没有任何好处。

提前致谢

-Eiríkur

【问题讨论】:

  • 您需要展示您编写的代码或至少尝试解决问题。
  • 欢迎来到 StackOverflow!到目前为止,您尝试过什么吗? StackOverflow 不是免费的代码编写服务,希望您能try to solve your own problem first。请更新您的问题以显示您已经尝试过的内容,展示您在minimal, complete, and verifiable example 中面临的特定问题。欲了解更多信息,请参阅how to ask good questions,并拨打tour of the site
  • @Grumpy 让硬币明显安全!使用 SHA256 没有人可以窃取硬币
  • @EiríkurÓliEyþórsson 你可以用这行代码得到一个抛硬币的结果:$result = array("heads", "tails")[random_int(0,1)];。这会给你随机的正面或反面。它的工作方式是,它生成一个随机的 0 或 1,并使用它来选择数组元素并将其分配给 $result 变量。

标签: php html css


【解决方案1】:

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

$result = array("heads", "tails")[random_int(0,1)];

首先,我们创建一个数组,这将是我们的选择。 array("heads, "tails") 表示我们将始终获得这两个结果之一。接下来,在同一行中,我们可以从我们之前创建的数组中选择一个元素来实际分配给$result 变量。我们可以使用random_int(min, max) 来生成那个号码。

注意:random_int() 生成的加密随机整数是 适用于无偏结果至关重要的地方,例如当 为扑克游戏洗牌。 http://php.net/manual/en/function.random-int.php

作为奖励,您可以向该数组添加更多元素,然后只增加random_int() 中的max 值,它就会起作用。您也可以通过以下方式使其更具动态性:

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

使用上面的代码,你可以有尽可能多的选择!


测试

我将这段代码运行了 50,000 次,这就是我的结果。

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

我将这段代码运行了 100,000 次,结果如下:

Array
(
    [tails] => 49960
    [heads] => 50040
)

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

https://eval.in/894945

【讨论】:

  • count($choices) - 1 或从 1 开始数组。
  • 谢谢 :) 这正是我所需要的,我想我只是让它变得更复杂;P
  • @EiríkurÓliEyþórsson 很高兴能帮上忙 :)
【解决方案2】:

上面的答案可能是大多数情况下的最佳答案。

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

在以下代码中,您需要为服务器计算一个种子。此外,您可能还想创建一个用户可以看到的公共种子。这些可以是任何东西,但我建议使用某种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 试用上面的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 2018-07-27
    • 1970-01-01
    相关资源
    最近更新 更多