【发布时间】:2022-01-18 11:17:08
【问题描述】:
我正在玩一些在 javascript 中掷骰子的演示,我从 6 个数字中选择 3 个数字并使用以下 sn-p 来获得随机结果:
let randomNumber = Math.floor(Math.random() * 6 + 1); // Random number between 1 and 6
这是全局随机的,这意味着一个玩家的胜率可以比 50% 高得多,而其他玩家的胜率则更低,等等。
我将如何实现让每个玩家的胜率都保持在 50% 而不是更高的水平?目前,我在滚动时遇到了巨大的胜利罢工,这意味着在现实生活中也是如此,所以我将如何限制自己永远不会超过例如 55% 的获胜率,如果确实如此,应该慢慢来向 50% 前进,如果低于 50%,反之亦然?
有没有api服务,当我为玩家提供ID时,它会保持输赢计数,保持50%左右的胜率? Aka 保留用户的历史数据等,并通过知道之前的滚动来决定下一个数字的赢/输比率,但如果 50 赢/50 输将做诚实的随机滚动。虽然我猜这会破坏胜利罢工。
所以我想我必须这样做:
- 如果赢/输率为 50%,进行合法的随机掷骰直到 51%,然后决定反对玩家回到 50% 的赢/率。我知道这不诚实,但有没有其他诚实的方法可以通过运行上面的 sn-p 来真正保持 50% 的随机化?
【问题讨论】:
-
给每个玩家自己的随机数生成器,种子不同。在 nodejs 中,它可能是分片。
-
关于最后一点,作为你可能想深入研究 Dota2(原魔兽争霸 III)中使用的伪随机生成机制的灵感:liquipedia.net/dota2/Pseudo_Random_Distribution
-
@huseyintugrulbuyukisik 你有这方面的例子吗?听起来很有趣。
-
@sensei 通常分片仅适用于少数进程,但如果不关心性能,则可能有数百个(甚至数千个)进程只有一些自己的微服务(对于每个播放器)。也许性能很差,但如果掷骰子不频繁,线程切换的延迟应该被隐藏。您还可以拥有一个用于高性能多人随机数生成的 C++ 应用程序,该应用程序由 nodejs 从命令行调用,并通过 ramdisk 或仅 i/o (stdin stdout) 进行通信。它需要在使用某些数据库或文件的进程调用之间进行一些状态保存