Laden...

Zufalls Byte[,] Array (.NextBytes(b)) liefert immer Nullen

Erstellt von Kleinstein11 vor 6 Jahren Letzter Beitrag vor 6 Jahren 2.782 Views
K
Kleinstein11 Themenstarter:in
21 Beiträge seit 2017
vor 6 Jahren
Zufalls Byte[,] Array (.NextBytes(b)) liefert immer Nullen

Hallo zusammen,

Ich möchte in einem Testprogramm ein byte[,] array erstellen und für jedes byte ein Zufallswert zuweisen. Dieses byte[,] array möchte ich wieder abrufen und in eine Tuple Liste "stecken".
Also die Liste sollte wie folgt aus sehen:
0,0,123
0,1,23
0,2,4....

Leider bekomme ich nur nullen für das array zugewiesen(im Lokalen fenster). Auf der Console bekomme ich auch nur System.Collections.Generic.List1[System.Tuple3[System.Int32,System.Int32,System.Byte]] ausgegeben.

Wie kann ich das umsetzen?

Hier meine vorgehensweise:

            Random zufall = new Random();
            Byte[,] array = new Byte[64, 240];
            byte[] b = new byte[0];

            List<Tuple<int, int, byte>> data = new List<Tuple<int, int, byte>>();

            foreach (byte wert in array)
            {
                zufall.NextBytes(b);
            }


            for (int x = 0; x < 64; x++)
            {
                for (int y = 0; y < 240; y++)
                {
                    
                    data.Add(Tuple.Create(x, y, array[x, y]));
                    Console.WriteLine(data);
                    Console.ReadKey();
                    
                }
            }
16.807 Beiträge seit 2008
vor 6 Jahren
Console.WriteLine(data);

ist quasi

Console.WriteLine(List<Tuple<int, int, byte>>);

Was soll da auch anderes rauskommen als System.Collections.Generic.List1[System.Tuple3[System.Int32,System.Int32,System.Byte]]?
Du gibst ja den Typ aus und nicht den Inhalt...

Auch das Erstellen von Zufallszahlen kann nicht stimmen.
Ein Buffer mit der Länge 0 ergibt halt 0. Davon abgesehen weist Du die erzeugte Zufallszahl - auch wenn sie wohl so nicht berechnet werden soll - nirgends zu.
Deine Initialwerte von 0 bleiben damit auch 0.

Deine Logik, die Du aufschreibst, passt gar nicht zum Quellcode 😉

709 Beiträge seit 2008
vor 6 Jahren

Du schreibst die Zufallswerte in b (mit 0 Elementen) und nutzt b nirgends.

K
Kleinstein11 Themenstarter:in
21 Beiträge seit 2017
vor 6 Jahren

Muss man die Liste erst in ein string convertieren?

Aber vorher ist ja auch schon ein Fehler da Zufallszahlen nicht dem Byte[,]array zugeordnet werden

J
251 Beiträge seit 2012
vor 6 Jahren

Da dir die vorherigen Antworten nicht weitergeholfen haben, ein weiterer Tipp.

Fokussiere dich auf den folgenden Ausschnitt:


foreach (byte wert in array)
{
    zufall.NextBytes(b);
}


Beschreibe dir selbst, was du da tust.

3.003 Beiträge seit 2006
vor 6 Jahren

byte[,] ist ein echtes zweidimensionales Array. Das ist ein völlig anderer Typ als ein eindimensionales Array. Die Methode NextBytes der Klasse Random erwartet als Parameter ein eindimensionales Array. Daher kannst du sie nicht benutzen.

Ich lass das Folgende mal unkommentiert stehen, mit ein wenig Eigeninitiative sollte dir das helfen.


static class Extensions
{
    public static void NextBytes(this Random random, byte[,] array)
    {
        for (int i = 0; i < array.GetLength(0); i++)
        for (int j = 0; j < array.GetLength(1); j++)
        {
            array[i, j] = (byte) random.Next(0, byte.MaxValue + 1);
        }
    }
}

Schau dir auch mal die Methode GetLength(n) des zweidimensionalen Arrays an und vergleiche sie mit der Eigenschaft Length.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

K
Kleinstein11 Themenstarter:in
21 Beiträge seit 2017
vor 6 Jahren

Das hat mir weiter geholfen, es klappt. vielen Dank!!!

W
872 Beiträge seit 2005
vor 6 Jahren

Was Du machst, nennt sich Random Testing/PropertyBased Testing.
Schau Dir mal FsCheck an - das ist ein Bibliothek für solches Testen.

3.003 Beiträge seit 2006
vor 6 Jahren

Das hat mir weiter geholfen, es klappt. vielen Dank!!!

Sehr schön, dann hier die bessere Variante 😉.


const int width = 64;
const int height = 240;

var flatArray = new byte[width * height];
random.NextBytes(flatArray); //<- exakt doppelt so schnell wie die Einzelbefüllung eines 2n-Arrays
var query = flatArray.Select((p, i) => new Tuple<int, int, byte>(i / height, i % height, p)).ToList();

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

16.807 Beiträge seit 2008
vor 6 Jahren

.. ob das nun für einen Anfänger "besser" verständlich ist als 5 Zeilen mehr Code... ich weiß ja nicht 😉

3.003 Beiträge seit 2006
vor 6 Jahren

.. ob das nun für einen Anfänger "besser" verständlich ist als 5 Zeilen mehr Code... ich weiß ja nicht 😉

Naja, das einzig unverständliche ist die letzte Zeile, und die war ja im ersten Beispiel nicht drin (dort hätte sie genauso ausgesehen, wenn man Linq benutzt). Der Punkt, den ich mit "besser" meinte, ist der Verzicht auf mehrdimensionale Arrays. C# unterstützt die Arbeit damit eher halbherzig, und genau wie in C(++) ist man in jedem Fall meistens besser dran, stattdessen mit flachen Arrays zu arbeiten und sich das bisschen Mehrarbeit mit dem Indexing zu machen. Grad als Anfänger übrigens. Man müsste mal schaun, wie oft Anfänger hier im Forum beim Arbeiten mit n-Arrays oder jagged Arrays in Schwierigkeiten geraten, gefühlt ist das jedenfalls ziemlich oft 😃.

Langer Rede kurzer Sinn: @TE, wenn es geht, lass array[,] oder array[][] weg. Und meistens geht es.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)