Laden...

Eigener auf RNGCryptoServiceProvider basierender Zufallsgenerator gibt meistens 0 zurück

Erstellt von ShinigamiSama vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.222 Views
S
ShinigamiSama Themenstarter:in
28 Beiträge seit 2011
vor 12 Jahren
Eigener auf RNGCryptoServiceProvider basierender Zufallsgenerator gibt meistens 0 zurück

Hallo liebe Community,

ich arbeite (Als Shinigami) zusammen mit einem Kumpel mit dem Pseudonym Toon
das erwähne ich schonmal, weil ihr vielleicht etwas öfter posts von mir bekommt...

Zum Thema: ich habe für unser Project eine DLL erstellt, welche folgenden Code beinhaltet:


´using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;

namespace ToonsImmobilienSimulatorsRndmDLL
{
    public class Functions
    {
        public static int GetRandomNumber64(byte min, byte max)
        {
            RNGCryptoServiceProvider csp = new RNGCryptoServiceProvider();
            byte[] numbers = new byte[1];
            csp.GetBytes(numbers);

            double divisor = 64F / (max - min + 1);
            if (min > 0 || max < 63)
            {
                for (int i = 0; i < 1; i++)
                {
                    numbers[i] = (byte)((numbers[i] / divisor) + min);
                }
            }
            return numbers[0];
        }

        public static int GetRandomNumber128(byte min, byte max)
        {
            RNGCryptoServiceProvider csp = new RNGCryptoServiceProvider();
            byte[] numbers = new byte[1];
            csp.GetBytes(numbers);

            double divisor = 128F / (max - min + 1);
            if (min > 0 || max < 127)
            {
                for (int i = 0; i < 1; i++)
                {
                    numbers[i] = (byte)((numbers[i] / divisor) + min);
                }
            }
            return numbers[0];
        }

        public static int GetRandomNumber256(byte min, byte max)
        {
            RNGCryptoServiceProvider csp = new RNGCryptoServiceProvider();
            byte[] numbers = new byte[1];
            csp.GetBytes(numbers);

            double divisor = 256F / (max - min + 1);
            if (min > 0 || max < 255)
            {
                for (int i = 0; i < 1; i++)
                {
                    numbers[i] = (byte)((numbers[i] / divisor) + min);
                }
            }
            return numbers[0];
        }

        public static int random(int paramDefPrice, byte paramMaxPriceChange)
        {
            int computeOperator = GetRandomNumber64(0, 1);
            int realPriceChange = GetRandomNumber256(0, paramMaxPriceChange);
            int var = 0;
            if (computeOperator == 0)
            {
                var = paramDefPrice + paramMaxPriceChange;
            }
            else if (computeOperator == 1)
            {
                var = paramDefPrice - paramMaxPriceChange;
            }
            return var;
        }
    }
}

so, die habe ich nun in das Projekt eingebunden:


private void thaus3_Tick(object sender, EventArgs e)
        {
            wert3 = Functions.random(3800, 64);
            twert3.Text = wert3.ToString();
            kaufen3 = wert3;
        }

Leider kommt als Ergebnis meißtens nur 0 raus (nicht immer)...
könntet ihr mir da vielleicht helfen? bin noch relativer Neuling von C#

PS: Falls es im falschen Berreich gepostet wurde, Tschuldigung, dann einfach verweisen, und ich werde beim nächsten mal drauf achten 😄

mfg
Shinigami
und
Toon

Hinweis von herbivore vor 12 Jahren

ich werde beim nächsten mal drauf achten

Ab dem zweiten Mal ist natürlich besser als nichts, aber im Grund erwarten wir schon, dass man sich von Anfang an die Regeln zu halten versucht.

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo ShinigamiSama, willkommen im Forum,

Leider kommt als Ergebnis meißtens nur 0

Das liegt daran, dass in der random-Methode (die übrigens Großgeschrieben werden sollte, also Random od. noch besser anders benamt wie z.B. mit NextNumber()) computeOperator nur auf 0 und 1 geprüft wird. Hat computeOperator einen anderen Wert, so bleibt var beim initialen Wert von 0.
Das wird wohl daher stammen, dass GetRandomNumber64 nicht das mach was es soll.

Solche Dinge kannst du mit dem Debugger leicht selbst feststellen, z.B. indem


if (var == 0) Debugger.Break();
return var;

in der random-Methode eingebaut wird.

Ich weiß jetzt nicht was deine Anwendung macht, aber wenn ich mir die thaus3_Tick-Methode und den Namespace "ToonsImmobilienSimulatorsRndmDLL" anschaue, dann vermute ich fast dass die System.Random-Klasse ausreicht. Für die Verwendung ist diese jedenfalls viel handlicher als dein Code. Schau dir dazu vorsorglich auch [FAQ] Random.Next liefert eine Zeit lang die gleiche Zufallszahl - Warum? Wie geht es richtig? an.

PS: Falls es im falschen Berreich gepostet wurde, Tschuldigung, dann einfach verweisen, und ich werde beim nächsten mal drauf achten 😄

Zur Orientierung wohin welche Frage gehört schau dir die Forenübersicht und deren Beschreibungen an.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

S
ShinigamiSama Themenstarter:in
28 Beiträge seit 2011
vor 12 Jahren

gfoidl danke, dass du dich gemeldet hast, aber deine Antwort ist mir noch etwas unschlüssig, aber vielleicht liegt es auch daran, dass ich nur schon müde bin, naja die DLL soll noch weitere Funktionen, die nicht standartmäßig da sind, beinhalten, da will ich es halt einfahc alles in einem, und die Anwendung ist eine Art Aktienspiel, nur dass man keine Aktien, sondern Immobielien handelt (Häuser);

schonmal danke für die Hilfe

mfg
Shinigami
und
Toon

Hinweis von herbivore vor 12 Jahren

Statt zu posten, wenn man müde ist, besser erst mal schlafen gehen.

1.346 Beiträge seit 2008
vor 12 Jahren

Warum nicht so?


//min ist inklusiv, max ist exklusiv
public static int GetRandomNumber(byte min, byte max)
{
            if(min >=max) throw new ArgumentOutOfRangeException("'min' must be smaler then 'max'");
            RNGCryptoServiceProvider csp = new RNGCryptoServiceProvider();
            byte[] numbers = new byte[1];
            csp.GetBytes(numbers);
            return min + (numbers[0] % (max- min));
}

Warum machst du dort überhaupt eine Unterscheidung?

S
ShinigamiSama Themenstarter:in
28 Beiträge seit 2011
vor 12 Jahren

Hmmm, hab den Fehler entdeckt, gfoidl du hattest recht :p
naja, Danke, und problem gelöst ^^

Danke und freundliche Grüße,
Shinigami
und
toon

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo ShinigamiSama,

dennoch nochmal der Hinweis, dass Zufallszahlen einfacher mit der Random-Klasse generiert werden können mit ausreichender Genauigkeit für ein Spiel. Schau dir mal die Next(int,int)-Methode der Random-Klasse an.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"