bye[] sequenzen zufällig verteilen und per offset ermitteln.

  • C#
  • .NET (FX) 1.0–2.0

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    bye[] sequenzen zufällig verteilen und per offset ermitteln.

    Hey,

    Zuerst : Mir ist kein passender Thread-Titel eingefallen! :D
    Ich habe etwas ziemlich verwirrendes vor, ich versuche es mal so gut es geht zu erklären.

    Also, um alle meine Aktionen in einer Variablen abzulegen habe ich eine

    C#-Quellcode

    1. List<byte> MainData = new List<byte>();


    erstellt.

    Nun werden in einem Loop neue daten eingetragen.
    Pro Loopschleife werden zwei byte[] arrays hinzugefügt.


    Dabei kann byte[] Data1 unterschiedlich lang sein, byte[] Data2 hat immer die gleiche Länge (6 bytes).

    D.h. in der Schleife sieht das ca so aus :


    C#-Quellcode

    1. byte[] Data1 = GetSomeRandomBytes();
    2. byte[] Data2 = GetSixRandomBytes();


    Nun werden die byte[]'s in der Liste hinzugefügt, byte[] Data2 zuerst.

    Anhand der Listenlänge und der Länge der Arrays kann ich mir die zwei "Offsets" der hinzugeügten arrays errechen, also der Offset an dem in der List<byte> mein
    byte[] Data2 und mein byte[] Data1 beginnt, soweit so gut.


    Ich möchte allerdings das bei jeder loop-iteration die byte[]'s angehängt werden sondern irgendwo in der Liste zufällkig hinzugefügt werden.
    Allerdings muss dabei folgendes beachtet werden:
    • byte[] Data1 und byte[] Data2 müssen nicht zwangsweise aufeinander folgen, können dies aber.
    • Ich muss am Ende des Loops von jedem array das bei jeder iteration hinzugefügt wird einen korrekten Offset haben, also wo jedes array beginnt, und bei byte[] Data1 noch die Länge.
    • Da mit jeder Loop-Iteration neue ararys hinzugefügt werden müssen die Offsets ständig (effizient!) angepasst werden.
    • Die zwei byte[]'s Data1 & Data2 die bei jedem Loop-Durchlauf hinzugefügt werden, sollen Random in der List<byte> plaziert werden, allerdings dürfen sie keine andere "Sequenz" von vorherigen Data-byte[]'s unterbrechen sondern müssen immer am ende oder am Anfang eines solchen arrays eingefügt werden.

    Wie mache ich das?
    Ich habe keine Idee wie ich das anstellen soll.

    ~Rikudo
    C# Developer
    Learning C++

    Rikudo schrieb:

    Idee
    Wird das Resultatarray nach jedem Insert ausgewertet oder erst nach n Umläufen?
    Wenn bereits eingefügte Sequenzen nicht unterbrochen werden dürfen, kommen pro Umlauf genau 2 neue mögliche Positionen hinzu, nämlich die Positionen am Ende der zuletzt eingefügten Arrays.
    Wenn Du Dir eine List mit den möglichen Indizes machst, musst Du beim Einfügen lediglich die dem Einfüge-Index folgenden Indizex um die Länge der eingefügten Arrays erhöhen und nach der Einfügeposition einen neuen Wert in die Arrayliste einfügen, dessen Wert eins kleiner ist, als der erste da hochgeschobene Index.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Wird das Resultatarray nach jedem Insert ausgewertet oder erst nach n Umläufen?

    Nach n Umläufen.

    RodFromGermany schrieb:


    Wenn bereits eingefügte Sequenzen nicht unterbrochen werden dürfen, kommen pro Umlauf genau 2 neue mögliche Positionen hinzu, nämlich die Positionen am Ende der zuletzt eingefügten Arrays.


    Nein.
    Es gibt mit jedem Loopdurchlauf mehr Position um die nächten DataArrays einzufügen, wenn bereits 10 durchläufe gemacht wurden, wurden
    insgesamt 40 arrays geadded, dementsprechend gibt es auch 40 mögliche position vom man das neue array "zwischenpacken" kann.

    RodFromGermany schrieb:


    Wenn Du Dir eine List mit den möglichen Indizes machst, musst Du beim Einfügen lediglich die dem Einfüge-Index folgenden Indizex um die Länge der eingefügten Arrays erhöhen und nach der Einfügeposition einen neuen Wert in die Arrayliste einfügen, dessen Wert eins kleiner ist, als der erste da hochgeschobene Index.

    Kannst du das mal mehr im Detail erklären ich verstehe das nicht ganz ;o

    C# Developer
    Learning C++

    Rikudo schrieb:

    Nein.
    Start:
    Positionen, an denen was eingefügt werden kann, Initiallänge sei 6:
    0, 1, 2, 3, 4, 5
    Nun fügen wir an Position 2 2 Bytes ein:
    x x x x x x ==> x x o o x x x x
    Mögliche Positionen nach dem 1. Einfügen:
    0, 1, 2, 3, 4, 5, 6, 7 ==> 0, 1, 2, 4, 5, 6, 7
    Fazit: aus 3, 4, 5 wird 5, 6, 7, die 4 wird neu eingefügt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Rikudo schrieb:

    ist platz für ein weiteres
    schreib ein Beispiel auf.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    So, oder:

    Quellcode

    1. ​Array a und b in der ersten iteration:
    2. a,b oder b,a
    3. Array c und d in der zweiten iteration
    4. a,b,c,d
    5. b,a,d,c
    6. c,d,a,b,
    7. b,d,c,a
    8. a,c,d,b
    9. ....


    Gibt doch tausend mögliche Anordnungen, ich muss nur die korrekten offsets bekommen.
    Hab mir überlegt evtl ist es auch sinnvoll, ganz normal anzuhängen, und dann den arrays so Art "Tags" zuzuweisen.
    Dann shuffeln und anhand der Tags wieder die Offsets oder so finden?
    C# Developer
    Learning C++

    Rikudo schrieb:

    a,c,d,b
    Das ist eine Permutation.
    Was hat das mit Deiner Beschreibung in Post #1 zu tun?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    @RushDen
    @Pinki

    ich habe mehr als zwei, nur werden in jeder loop iteration zwei neue durch andere funktionen die hier irrelvant sidn generiert.

    Also sagen wir ich habe :

    Quellcode

    1. Bei Iteration #1:
    2. arr[] a = {3,3,3,4,4,4,5,5,5};
    3. arr[] b = {1,2,3,4,5,6};
    4. Bei Iteration #2:
    5. arr[] a = {9,8,9,8,9,8,9,8,9};
    6. arr[] b = {1,3,3,7,1,1};
    7. Bei Iteration #3:
    8. arr[] a = {1,2,1,2,1,2,1,2,1,2,1,2};
    9. arr[] b = {4,8,6,2,8,0};


    Wenn ich die jetzt einfach zur Liste adde (arr b immer vor arr a) hätte ich:

    Quellcode

    1. arr[] RESULT = {1,2,3,4,5,6,3,3,3,4,4,4,5,5,5,1,3,3,7,1,9,8,9,8,9,8,9,8,9,4,8,6,2,8,0,1,2,1,2,1,2,1,2,1,2,1,2};


    Quellcode

    1. Sowie die Offsets der einzelnen Arrays:
    2. Offset arr A der ersten Iteration : 0

    Quellcode

    1. Offset arr B der ersten Iteration : 6
    2. Offset arr A der zweiten Iteration : 15
    3. Offset arr B der zweiten Iteration : 21
    4. Offset arr A der dritten Iteration : 30
    5. Offset arr B der dritten Iteration : 36


    ICh will aber vermeiden das die so geordned appended werden, sondern, quasi geshuffled geadded werden, brauche aber trotzdem die richtigen Offsets zu den
    jeweiligen einzelnen arrays die zum HauptArray/List<byte> geadded werden.
    C# Developer
    Learning C++

    Rikudo schrieb:

    Also sagen wir ich habe
    Mach das mal eine Runde einfacher, z.B. so wie ich es in Post #4 gemacht habe.
    Gib Elementen, die nicht unterbrochen werden dürfen, einen entsprechend anderen Namen.
    Start:
    a, a, a, a, a
    b1 eingefügt (Index, um zwischen b1 und b2 einfügen zu können):
    a, a, b1, b1, b1, b1, a, a
    b2 eingefügt:
    a, a, b2, b2, b2, b2, b1, b1, b1, b1, a, a
    usw.
    Eingefügt werden darf vor und nach jedem "a" und zwischen verschiedenen Zeichen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Rikudo schrieb:

    Also sagen wir ich habe
    Mach das mal eine Runde einfacher, z.B. so wie ich es in Post #4 gemacht habe.
    Gib Elementen, die nicht unterbrochen werden dürfen, einen entsprechend anderen Namen.
    Start:
    a, a, a, a, a
    b1 eingefügt (Index, um zwischen b1 und b2 einfügen zu können):
    a, a, b1, b1, b1, b1, a, a
    b2 eingefügt:
    a, a, b2, b2, b2, b2, b1, b1, b1, b1, a, a
    usw.
    Eingefügt werden darf vor und nach jedem "a" und zwischen verschiedenen Zeichen.


    Und wie würdest du für jedes elemt die Offsets speichern?
    Eine Art Dictionary<ybte[],int> das ständig aktualisiert wird?
    C# Developer
    Learning C++

    Rikudo schrieb:

    Offsets
    Da genügt eine List<int>.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!