Questi sono i miei dadi fortunati [chiuso]


10

Implementa un programma o una funzione che simuli i dadi comuni per i giochi di ruolo. Dovrebbe gestire almeno il d6 e il d20, i due dadi più comuni.

Tuttavia, dovrebbe funzionare come i giocatori stereotipati si aspettano che funzionino e non come un vero gioco di dadi.

È uno scherzo tra i giocatori che si può avere un dado particolarmente fortunato per un tiro molto importante, lanciando precedentemente molti dadi, selezionando quelli che hanno portato a un "1", quindi lanciandoli di nuovo, fino a quando non si ottiene alcuni che hanno ottenuto un "1" più volte. Quindi li conservi attentamente, perché hanno tirato 1 volte più volte in sequenza, quindi la probabilità di ottenere 1 volta successivo dovrebbe essere estremamente bassa.

Naturalmente, non è così che funzionano i dadi nella vita reale , perché i tiri sono statisticamente indipendenti.

I dadi simulati devono tenere conto dei tiri precedenti e funzionare in modo simile a come il giocatore nella fallacia del giocatore si aspetta che funzioni. Ad esempio, se sono stati lanciati molti numeri bassi, è necessario aumentare la probabilità di ottenere un numero più alto.

Tuttavia, poiché questo è un imbroglio, devi nasconderlo bene . Ciò significa che uno sguardo casuale al programma non dovrebbe rivelare che hai imbrogliato. Ciò significa che salvare in modo esplicito i risultati precedenti e leggerli ad ogni lancio sarebbe troppo sospetto. Devi nascondere questa "proprietà" dei tuoi dadi e punti bonus se la rendi plausibile negabile e la nascondi come un errore onesto. (ad esempio, fai il tuo RNG con un difetto "non intenzionale")

Elettori, si prega di tenere conto di quanto bene sia nascosto questo "difetto".

I programmi dovrebbero essere chiari e non offuscati. È troppo facile nascondere il codice malvagio in un programma offuscato.


3
Di quanto stiamo parlando bene nascosti? IMO, qualsiasi cosa al di là dell'equivalente del linguaggio getRandomBetween(1,d)mi indurrebbe ad approfondire.
Geobits

@Geobits: puoi trovare un ottimo esempio di come risolvere i problemi subdoli qui: codegolf.stackexchange.com/questions/19569/… Voglio dire che puoi fare qualsiasi cosa se lo giustifichi abbastanza bene, ovviamente, la giustificazione può essere un grossa bugia.
vsz

Godmaydamnit, java non ha abbastanza stranezze per cose
subdole


4
Sto votando per chiudere questa domanda come fuori tema perché adesso le sfide subdole sono fuori tema e in qualche modo questa è scivolata sotto il radar.
Mego

Risposte:


3

Giava

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

È così semplice che ovviamente non nasconde nulla: ma java.util.Randomè un semplice generatore congruenziale lineare e utilizza una tecnica di scarto per garantire l'uniformità, quindi garantisce che in ogni corsa del più grande multiplo di sizepiù piccoli di 2 ^ 48 campioni distribuirà il numeri uniformemente, soddisfacendo il requisito.


non riesco a capire come funziona java.util.random
masterX244

Lo scarto che si java.util.Randomesibisce ha ben poco a che fare con il comportamento di questa risposta. In realtà, ciò su cui si basa questa risposta è il fatto che, come qualsiasi RNG, java.util.Randomha un punto e se si generano un numero di numeri nell'ordine del periodo, le sue proprietà statistiche si rompono. Non è molto interessante; lo stesso accadrebbe anche con un RNG sicuro dal punto di vista crittografico come Blum Blum Shub se lo avessi eseguito abbastanza a lungo.
user2357112 supporta Monica

@utente2357112, l'eliminazione è rilevante perché la domanda richiede uniformità, non una leggera propensione per i numeri più piccoli. A mio avviso, questa risposta incarna la disinvoltura: l'uso deliberato di una libreria standard in un modo che a prima vista sembra trasparente in modo corretto ma che in realtà lo porta al di fuori dei suoi parametri di progettazione.
Peter Taylor,

Praticamente ogni RNG fa la cosa degli scarti, però. Non è niente di speciale. Avresti potuto usare questa risposta con letteralmente qualsiasi generatore di numeri pseudocasuali, perché se un RNG 1) ha un punto e 2) può produrre più di 1 numero diverso, quindi nell'ambito di un singolo periodo, più un numero è apparso rispetto ad altri numeri, meno verrà visualizzato fino al periodo successivo con un semplice argomento di conteggio.
user2357112 supporta Monica

L'analisi in questa risposta richiede nell'ordine di 2 ^ 48 tiri per mostrare un effetto. Forse se avessi usato un'analisi più sofisticata, dimostrando che l'uso di un LCG fa apparire anomalie statistiche misurabili all'interno di un numero di tiri che apparirebbero plausibilmente in un gioco da tavolo, questa potrebbe essere una risposta accettabile. Quando stai parlando di trilioni di rotoli, però, non è molto subdolo.
user2357112 supporta Monica

0

Rubino

Attualmente supporta solo d6, aggiungerà il supporto d20 in seguito ...

Ecco ed ecco, quei dadi sono cattivi!

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

Aggiungerei un "abort" richiede ruby ​​2 "se RUBY_VERSION <" 2 "'lì dentro da qualche parte, come se lo avessi eseguito su versioni precedenti
rovinerebbe

0

Haskell

Usa una cosa a caso per fare un'altra cosa a caso: in questo caso, mescola le carte per generare lanci di dadi.

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

Accetta un argomento, il numero di facce sul dado. L'output è così:

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

... e così via per tutte le carte (gli scarti non vengono stampati). Troppo ovvio?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.