Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Zufalls Byte[,] Array (.NextBytes(b)) liefert immer Nullen
Kleinstein11
myCSharp.de - Member



Dabei seit:
Beiträge: 21

Themenstarter:

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

beantworten | zitieren | melden

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.List`1[System.Tuple`3[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();
                    
                }
            }
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16110

beantworten | zitieren | melden

Console.WriteLine(data);

ist quasi

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

Was soll da auch anderes rauskommen als System.Collections.Generic.List`1[System.Tuple`3[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 ;-)
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
pinki
myCSharp.de - Member

Avatar #avatar-4072.jpg


Dabei seit:
Beiträge: 703
Herkunft: OWL

beantworten | zitieren | melden

Du schreibst die Zufallswerte in b (mit 0 Elementen) und nutzt b nirgends.
private Nachricht | Beiträge des Benutzers
Kleinstein11
myCSharp.de - Member



Dabei seit:
Beiträge: 21

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Jamikus
myCSharp.de - Member



Dabei seit:
Beiträge: 251
Herkunft: Oberhausen (NRW)

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3062
Herkunft: Thüringen

beantworten | zitieren | melden

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)
private Nachricht | Beiträge des Benutzers
Kleinstein11
myCSharp.de - Member



Dabei seit:
Beiträge: 21

Themenstarter:

beantworten | zitieren | melden

Das hat mir weiter geholfen, es klappt. vielen Dank!!!
private Nachricht | Beiträge des Benutzers
weismat
myCSharp.de - Member



Dabei seit:
Beiträge: 878
Herkunft: Frankfurt am Main

beantworten | zitieren | melden

Was Du machst, nennt sich Random Testing/PropertyBased Testing.
Schau Dir mal FsCheck an - das ist ein Bibliothek für solches Testen.
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3062
Herkunft: Thüringen

beantworten | zitieren | melden

Zitat von Kleinstein11
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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von LaTino am .
"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)
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16110

beantworten | zitieren | melden

.. ob das nun für einen Anfänger "besser" verständlich ist als 5 Zeilen mehr Code... ich weiß ja nicht ;-)
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3062
Herkunft: Thüringen

beantworten | zitieren | melden

Zitat von Abt
.. 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)
private Nachricht | Beiträge des Benutzers