所以我正在尝试使用coinflip系统创建网站(它只是我在空闲时间做的一个小项目)但我真的不知道从哪里开始。我需要在php(所以它在后端)中创建它,我需要它可证明是公平的(所以我可以证明它是合法的)。我发现的是我需要使用像sh256这样的东西,但我也听说过它很过时,很容易破解。此外,如果它重要,它是一个有蒸汽登录系统的网站,所以我计划能够加入1v1与其他蒸汽用户,而不仅仅是坐在我旁边的人或其他东西(不只是一个按钮就是我的意思嘿嘿)。
编辑:我搜索过它并尝试询问我认识的人等等,如果他们知道什么,但没有什么是好的。提前致谢
-Eiríkur
答案 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
)
你可以在这里玩,查看结果:
答案 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尝试上面的代码。