Nota: Per brevità, quanto segue non discerne tra casualità e pseudo-casualità. Inoltre, in questo contesto, significa vincolatatra proposta minimo e massimo valori)Generazione di valori vincolati casuali (pseudo) di (U) Int64 e Decimale
La classe System.Random
fornisce generazione casuale di numeri interi, doppie e campi di byte. Uso casuale. Successivamente, si possono facilmente generare valori vincolati casuali di tipo Booleano, Char, (S) Byte, (U) Int16, (U) Int32. Usando Random.NextDouble()
, si possono similmente generare valori vincolati di tipi Double e Single (per quanto riguarda la mia comprensione di questo tipo). Generazione casuale di stringhe (di una determinata lunghezza e alfabeto) hasalsobeentackledbefore.
Considerare i restanti tipi di dati primitivi (escluso Oggetto): Decimale e (U) Int64. Anche la loro generazione casuale è stata affrontata (Decimal, (U)Int64 usando Random.NextBytes()
), ma non quando vincolata. Il campionamento di rigetto (cioè il looping fino a quando il valore generato è l'intervallo desiderato) potrebbe teoricamente essere usato, ma ovviamente non è una soluzione pratica. La normalizzazione NextDouble()
non funziona perché non ha cifre significative.
Insomma, chiedo per la corretta attuazione delle seguenti funzioni:
long NextLong(long min, long max)
long NextDecimal(decimal min, decimal max)
Si noti che, dal momento che System.DateTime
si basa su un ulong, la prima funzione permetterebbe di generazione casuale vincolata di tali struct come bene (simile a here, solo in zecche anziché minuti).
Grazie per le linee guida! +1 –
È davvero così difficile? Mi manca qualcosa, perché il mio primo pensiero era usare 'Random.NextBytes' e utilizzare le operazioni bit a bit per applicarli ai bit decimali appropriati per ottenere un valore compreso tra 0 e 1. –