Bunlar benim şanslı zarım [kapalı]


10

Rol yapma oyunları için ortak zarları simüle eden bir program veya işlev uygulayın. En az iki yaygın zar olan d6 ve d20'yi ele almalıdır.

Ancak, stereotipik oyuncular gerçek zar işi olarak değil, çalışmalarını bekledikçe çalışmalıdır.

Oyuncular arasında bir şaka, daha önce çok fazla zar atarak, "1" ile sonuçlananları seçerek, sonra tekrar atarak, çok önemli bir rulo için özel olarak şanslı bir ölüme sahip olabilir. birkaç "1" birden çok kez yuvarlandı. Daha sonra bunları dikkatlice korursunuz, çünkü sırayla 1 kez birden yuvarlandılar, böylece bir sonraki seferde yuvarlanma olasılığı son derece düşük olmalıdır.

Tabii ki, zar gerçek hayatta böyle çalışmaz , çünkü rulolar istatistiksel olarak bağımsızdır.

Simüle edilmiş zarlarınız önceki atışları hesaba katmalı ve kumarbazın yanılgısındaki kumarbazın nasıl çalışmasını beklediğine benzer şekilde çalışmalıdır. Örneğin, çok sayıda düşük sayı haddelenmişse, daha yüksek sayı haddeleme olasılığı arttırılmalıdır.

Ancak, bu hile yaparken, iyi gizlemek zorundasınız . Bu, programa gündelik bir bakışta hile yaptığınızı göstermemelisiniz. Bu, önceki sonuçları açıkça kaydetmek ve her atışta okumak çok şüpheli olacaktır. Eğer zar zor bu "mülkiyet" gizlemek gerekir ve bonus inandırıcı yapmak inkar ve dürüst bir hata olarak gizlemek. (örneğin, "kasıtsız" bir kusurla kendi RNG'nizi yaparsınız)

Seçmenler, lütfen bu "kusurun" ne kadar gizli olduğunu dikkate alın.

Programlar açık olmalı ve gizlenmemelidir. Gizlenmiş bir programda kötü kodu gizlemek çok kolay.


3
Ne kadar gizli konuşuyoruz? IMO, dilin eşdeğerinin ötesinde bir şey getRandomBetween(1,d)daha derinlemesine bakmama neden olur.
Geobits

@Geobits: El altında kalan sorunları nasıl çözeceğinize dair çok güzel bir örnek bulabilirsiniz: codegolf.stackexchange.com/questions/19569/… Yani yeterince iyi haklı çıkarırsanız her şeyi yapabilirsiniz, elbette, gerekçe bir büyük Yalan.
vsz

Godmaydamnit, java underhanded şeyler için yeterince tuhaf değil ...
masterX244


4
Bu soruyu konu dışı olarak kapatmak için oy kullanıyorum çünkü el altında kalan zorluklar artık konu dışı ve bu bir şekilde radarın altına düştü.
Mego

Yanıtlar:


3

Java

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;
    }
}

Öyle basit ki, hiçbir şeyi gizlemiyor: ama java.util.Randombasit bir doğrusal uyumlu jeneratördür ve homojenliği sağlamak için bir atma tekniği kullanır, bu nedenle size2 ^ 48'den küçük numunelerin en büyük katlarının herhangi bir çalışmasında dağıtılacağını garanti eder. Sayıları eşit, gereksinimi karşılar.


cant get arkasında açıklamak nasıl java.util.random çalışır
masterX244

Gerçekleştirilen atılanın java.util.Randombu cevabın davranışı ile çok az ilgisi vardır. Gerçekten, bu cevabın dayandığı şey, herhangi bir RNG gibi java.util.Randombir periyodun olması ve dönemin sırasına göre bir dizi sayı üretmeniz durumunda, istatistiksel özelliklerinin bozulmasıdır. Bu çok ilginç değil; aynı şey, eğer yeterince uzun süre çalıştırırsanız, Blum Blum Shub gibi kriptografik olarak güvenli bir RNG ile bile olur.
user2357112 Monica

@ user2357112, atma önemlidir çünkü soru daha küçük sayılara küçük bir önyargı değil, üniformluk gerektirir. Kanımca bu cevap yetersizliği özetler: standart bir kütüphanenin ilk bakışta şeffaf bir şekilde doğru gibi görünen ama aslında onu tasarım parametrelerinin dışına çıkaracak şekilde kasıtlı kullanımı.
Peter Taylor

Yine de hemen hemen her RNG atılan şeyi yapıyor. Özel birşey değil. Bu cevabı kelimenin tam anlamıyla herhangi bir sözde sayı üreteciyle kullanabilirsiniz, çünkü bir RNG 1) bir periyodu varsa ve 2) 1'den fazla farklı sayı üretebilirse, o zaman tek bir periyot kapsamında, bir sayı daha fazla ortaya çıktı diğer sayılara göre, basit bir sayım argümanı ile bir sonraki döneme kadar o kadar az görünecektir.
user2357112 Monica

Bu yanıttaki analiz, bir efektin görünmesi için 2 ^ 48 rulo sırasını gerektirir. Belki daha sofistike bir analiz kullandıysanız, bir LCG kullanımının ölçülebilir istatistiksel anormalliklerin bir masa üstü oyunda makul bir şekilde görünecek birkaç rulo içinde görünmesine neden olduğunu gösteren, bu iyi bir cevap olabilir. Trilyonlarca rulodan bahsederken, bu çok az elverişli değil.
user2357112 Monica

0

Yakut

Şu anda sadece d6 desteği, daha sonra d20 desteği ekleyecek ...

Bakın ve bu dices kötü!

# 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])
...

Orada bir yerde RUBY_VERSION <"2" 'varsa bir "kürtaj" yakut 2 gerektirir "eklerdim, önceki sürümlerde çalıştırır gibi hile
bozar gibi

0

Haskell

Başka bir rastgele şey yapmak için rastgele bir şey kullanın: Bu durumda, zar atışları oluşturmak için kartları karıştırın.

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

Bir argüman alır, kalıptaki yüzlerin sayısı. Çıktı şöyle:

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

... vb. tüm kartlar için geçerlidir (kartlar yazdırılmaz). Çok bariz?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.