这些是我的幸运骰子[关闭]


10

实现一个程序或函数,以模拟角色扮演游戏的普通骰子。它至少应处理最常见的两个骰子d6和d20。

但是,它应该像定型游戏玩家期望的那样工作,而不是像真正的骰子那样工作。

这是玩家之间的一个玩笑,一个人可以为非常非常重要的掷骰而特别幸运地掷骰子,方法是预先掷出很多骰子,选择那些结果为“ 1”的骰子,然后再次掷出它们,直到获得一些将其多次滚动为“ 1”。然后,您要仔细保存它们,因为它们顺序滚动了1次,因此下次滚动1的可能性应该非常低。

当然,这不是骰子在现实生活中的工作方式,因为掷骰在统计上是独立的。

您模拟的骰子必须考虑先前的掷骰,并且其工作方式与赌徒谬论中的赌徒期望其运作的方式类似。例如,如果滚动了很多低数字,则应该增加滚动更高数字的可能性。

但是,由于这是作弊行为,因此必须将其隐藏起来。这意味着,随意浏览该程序不应显示出您被骗。这意味着,显式地保存先前的结果并在每次抛出时都读取它们将太可疑。您必须隐藏骰子的这种“属性”,如果您将其合理化,并且将其伪装成诚实的错误,则可以隐藏奖励积分。(例如,您制作带有“意外”缺陷的RNG)

选民们,请考虑一下这个“缺陷”的隐藏程度。

程序应清晰无误。在经过混淆的程序中隐藏邪恶的代码太容易了。


3
我们谈论的隐藏程度如何?IMO,超出该语言等效范围的任何内容getRandomBetween(1,d)都会使我更深入地研究它。
Geobits 2014年

@Geobits:您可以在此处找到一个很好的示例,说明如何解决人为不足的问题:codegolf.stackexchange.com/questions/19569 / ... 我的意思是,如果您对它进行充分的论证,则可以执行任何操作,当然,该论证可以是大谎言。
vsz 2014年

Godmaydamnit,java没有足够的怪癖来
应付不满意的


4
我投票结束这个问题是不合时宜的,因为处理不足的挑战现在已经不合时宜了,不知何故这个问题已经悄无声息。
Mego

Answers:


3

爪哇

public class GamerDie {
    private final java.util.Random rnd;
    private final int sides;

    public GamerDie(int sides) {
        this.sides = sides;
        this.rnd = new java.util.Random();
    }

    public int throw() {
        return rnd.nextInt(sides) + 1;
    }
}

它是如此简单,以至于显然没有隐藏任何东西:但是它java.util.Random是一个简单的线性同余生成器,并且它使用了丢弃技术来确保均匀性,因此它保证了在size小于2 ^ 48个样本的最大倍数的任何运行中,它将分布编号均匀,满足要求。


无法落后于解释java.util.random的工作原理
masterX244 2014年

java.util.Random执行的丢弃与该答案的行为无关。的确,此答案所依赖的事实是,与任何RNG一样,它java.util.Random都有一个句点,并且如果您按该句点的顺序生成多个数字,则其统计属性会崩溃。那不是很有趣;如果运行足够长的时间,即使是像Blum Blum Shub这样的具有加密安全性的RNG也会发生同样的情况。
user2357112支持Monica

@ user2357112,丢弃是相关的,因为问题需要统一,而不是较小的偏差。在我看来,这个答案体现了不熟练之处:故意使用标准库,乍一看似乎是正确的,但实际上超出了其设计参数。
彼得·泰勒

但是,几乎每个RNG都会进行丢弃。没什么特别的 您可能会在字面上使用任何伪随机数生成器来使用此答案,因为如果RNG 1)有一个句点,而2)可以产生1个以上的不同数字,那么在一个句点的范围内,出现的数字就更多相对于其他数字,通过下一个简单的计数参数,它显示到下一个周期的数量将减少。
user2357112支持Monica 2014年

此答案中的分析需要2 ^ 48卷才能显示效果。也许,如果您使用了更复杂的分析方法,表明使用LCG会导致可测量的统计异常出现在一些可能出现在桌面游戏中的掷骰子中,那么这可能是一个好的答案。但是,当您谈论数万亿卷时,这并不是很不足。
user2357112支持Monica 2014年

0

红宝石

目前仅支持d6,稍后会添加d20支持。

瞧瞧-这些骰子真讨厌!

# first idea was to create 6 super cool dices just by copy&paste
# -> each dice holds its number at the beginning of the array
# -> we don't need all of them now, so we comment them out
dice0 = %w[[[[[[[[[ 0 . : :. :: ::. ::: ]]]]]]]]
#dice1 = %w[[[[[[[ 1 : . :. ::. :: ::: ]]]]]]]
#dice2 = %w[[[[[[ 2 . : :. :: ::. ::: ]]]]]]
#dice3 = %w[[[[[[ 3 : . :. ::. :: ::: ]]]]]]]
#dice4 = %w[[[[[[[ 4 . : :. :: ::: ::. ]]]]]]]
#dice5 = %w[[[[[[[[ 5 . : :. :: ::. ::: ]]]]]]]]]

# and hey, those dices are almost ascii art ;)

# well, let's just create a standard dice
# -> get rid of the number at the beginning
# -> then sort (maybe we need that later due to the
#    currently unused dices being unsorted)
dice = dice0.select!{|e| /[:.]+/ === e}.sort

def roll(d)
  # rolling is easy
  # -> use size instead of hardcoded number,
  #   maybe we'll have other dices later
  d.slice!(rand(d.size - 1))
end

# and here you have 8 very underhanded dices!
dices = [dice]*8

# roll like a champion
roll(dices[0])
...

如果在某处的RUBY_VERSION <“ 2”',我会添加一个“异常终止”,需要ruby 2,就像您在较早版本上运行时一样,它会破坏窍门
Bazzargh 2014年

0

哈斯克尔

用一个随机的东西做另一个随机的东西:在这种情况下,洗牌可以产生骰子投掷。

import System.Environment
import System.Random
import Data.Array.IO
import Control.Monad
-- make random dice from random cards
suit c=map (\(a,b)->[a,b])$zip "A23456789TJQK" (repeat c)
deck=concatMap(\s->suit s) "♠♥♦♣"
-- just like casinos, use more decks for extra randomness
decks=concat$take 8$repeat deck
-- shuffle the cards
shuffle :: [a] -> IO [a]
shuffle xs = do
        ar <- newArray n xs
        forM [1..n] $ \i -> do
            j <- randomRIO (i,n)
            vi <- readArray ar i
            vj <- readArray ar j
            writeArray ar j vi
            return vj
  where
    n = length xs
    newArray :: Int -> [a] -> IO (IOArray Int a)
    newArray n xs =  newListArray (1,n) xs
-- convert a card to a die, by counting along the original deck
-- then taking mod (faces). If we don't have enough cards to make
-- a full set of faces, assign the 'extra' cards a value of 0
card2die faces card=
  let index=(head[i|(i,c)<-zip[0..]deck,c==card]) in
  if (index > (length deck-(length deck`mod`faces)))
  then 0
  else (index`mod`faces)+1
main=
  do
    args <- getArgs
    let faces = read (args!!0)
    -- throw away cards we can't map to die faces
    cards<-shuffle$filter (\card->card2die faces card/=0) decks
    mapM_ (\card->putStrLn (card++" -> "++(show (card2die faces card)))) cards

接受一个论点,即模具上的面数。输出是这样的:

./cards 20|head
2♦ -> 8
7♥ -> 20
J♦ -> 17
6♥ -> 19
9♥ -> 2
8♥ -> 1
5♥ -> 18
4♠ -> 4
Q♥ -> 5
2♣ -> 1

...等等,所有卡(未打印丢弃卡)。太明显了吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.