c# i random

0

Witam, mam taki ciekawy (?) program, ktory bawi sie randomami:

class Program
    {
        public static int Rnd1(int x)
        {
            Random r = new Random();
            return r.Next(x);
        }

        public static int Rnd2(int x)
        {
            int seed = DateTime.Now.Hour +
                           DateTime.Now.Minute +
                           DateTime.Now.Second +
                           DateTime.Now.Millisecond;
                            
            //Console.WriteLine(seed.ToString());
            Random r = new Random(seed);
            return r.Next(x);
        }

        static void Main(string[] args)
        {
            int[] tab = new int[10];
            Random r = new Random();
            for (int i = 0; i < tab.Length; ++i)
                tab[i] = r.Next(10);

            for (int i = 0; i < tab.Length; ++i)
                Console.WriteLine(tab[i].ToString());
            
            Console.WriteLine();

            for (int i = 0; i < tab.Length; ++i)
                tab[i] = Rnd1(10);

            for (int i = 0; i < tab.Length; ++i)
                Console.WriteLine(tab[i].ToString());
            
            Console.WriteLine();

            for (int i = 0; i < tab.Length; ++i)
                tab[i] = Rnd2(10);

            for (int i = 0; i < tab.Length; ++i)
                Console.WriteLine(tab[i].ToString());

            Console.ReadLine();
        }
    }

Jeszcze ciekawszy jest wynik, mianowicie w pierwszym przypadku wylosuje poprawnie (nie dziwie sie), natomiast w przypadkach 2 i 3 otrzymam 10 takich samych liczb w tablicy. Prawdopodobnie dziala tak szybko ze uzywa tego samego seeda do tworzenia obiektu random, potwierdza to odkomentowanie linii w funkcji Rnd2(). No i teraz pytanie, czy istnieje jakakolwiek mozliwosc aby to dzialalo poprawnie?
Myslalem o jakims System.Wait(1 milisekunda) ale nie wydaje mi sie to zbyt eleganckie.

0

Zawsze możesz używać jednej instancji typu Random lub do konstruktora podać poniższą właściwość Environment.TickCount, co spowoduje zróżnicowanie wyników ;)

0

Chyba zawsze i w każdym języku używa się jednego generatora liczb pseudolosowych na klasę/moduł/cokolwiek innego z czego składa się program i woła go w odpowiednich metodach/funkcjach/czym się chce :|

0

... czyli coś w ten deseń:

class Program
    {
        private static Random _Random = new Random();
        public static int Rnd3(int x)
        {            
            return _Random.Next(x);
        }
}
0

Tylko po co robić do tego funkcje? Przecież w klasie Random już jest wbudowana.

0

Słyszałem też o innej wersji klasy Random, która służy do losowania liczb na zabezpieczenia, podobno jest wolniejsza niż zwykłe random, ale jest za to całkowicie losowa, a nie pseudolosowa. Nie pamiętam tylko gdzie się ona znajdowała.

0
hubert_nnn napisał(a)

ale jest za to całkowicie losowa

Nie ma czegoś takiego w świecie komputerowym ;-P
A być może i w rzeczywistości nie ma...

... mam dziwne wrażenie, że nie obędzie się bez polemiki :-)

0

Pewno do komputera jest podpięty krasnoludek, którzy rzuca kostką i zwraca wyniki ;P

0

Pewnie do tego rzut kostką k1?

0

Znalazłem chyba. Chodzi o klasę System.Security.Cryptography.RandomNumberGenerator.

Cryptographic random number generators create cryptographically strong random values

0

RandomNumberGenerator to akurat klasa abstrakcyjna nie zawierająca kodu "losującego". Ale pewnie chodziło Ci o RNGCryptoServiceProvider, która implementuje tą klasę. Tylko że to też generuje liczby pseudolosowe :>

0
Hass napisał(a)

RandomNumberGenerator to akurat klasa abstrakcyjna nie zawierająca kodu "losującego". Ale pewnie chodziło Ci o RNGCryptoServiceProvider, która implementuje tą klasę. Tylko że to też generuje liczby pseudolosowe :>

Klasa RandomNumberGenerator posiada publiczną statyczną metodę Create() która zwraca instancję klasy RandomNumberGenerator

0

https://www.random.org/integers/?num=100&min=1&max=100&col=1&base=10&format=plain&rnd=new

Zawsze można skorzystać z takich generatorów, które bazują na radiach zbierających szum ze świata.

0

Nie ma czegoś takiego w świecie komputerowym ;-P

Nieprawda.
To że przeciętny pecet nie posiada takiego generatora, nie znaczy że „nie ma czegoś takiego”.

1

Nieprawda. To że przeciętny pecet nie posiada takiego generatora, nie znaczy że „nie ma czegoś takiego”. - No softwarowo się nie da wygenerować...?

1 użytkowników online, w tym zalogowanych: 0, gości: 1