Integer mit spezifischem Bitset generieren
- C#
- .NET (FX) 1.0–2.0
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 35 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.
-
-
Und .. was haltet ihr von dieser Lösung?
C#-Quellcode
- public static uint GenerateUInt32(int n)
- {
- if (n == 0)
- return 0;
- if (n < 0 || n > 32)
- throw new ArgumentOutOfRangeException("n");
- return Enumerable.Range(0, 32).Select(i => i < n ? true : false).Shuffle().Select((b, i) => new { Index = i, Value = b }).Aggregate(0u, (last, current) => unchecked(last + (uint)((current.Value ? 1 : 0) << current.Index)));
- }
Zusatz C#-Quellcode
- public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source)
- {
- var rng = new Random();
- return source.Shuffle(rng);
- }
- public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source, Random rng)
- {
- if (source == null) throw new ArgumentNullException("source");
- if (rng == null) throw new ArgumentNullException("rng");
- return source.ShuffleIterator(rng);
- }
- private static IEnumerable<T> ShuffleIterator<T>(
- this IEnumerable<T> source, Random rng)
- {
- var buffer = source.ToList();
- for (int i = 0; i < buffer.Count; i++)
- {
- int j = rng.Next(i, buffer.Count);
- yield return buffer[j];
- buffer[j] = buffer[i];
- }
- }
Ist eigentlich lustig, das noch keiner auf die Idee gekommt ist, LINQ zu nutzen.Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „AliveDevil“ ()
-
@AliveDevil
Ich dachte erst anEnumerable.Concat(Enumerable.Repeat(True, HighBitCount), Enumerable.Repeat(False, 32 - HighBitCount)).OrderBy(Function(i) Rnd.NextDouble)
aber das war mir erstens zu lang und zweitens zu LINQ-lastig.
Und doch, LINQ wurde schon gezeigt: Post #4
Edit: Und auch, dass der TE LINQ nicht verwenden kann, weil Framework-Einschränkungen."Luckily luh... luckily it wasn't poi-"
-- Brady in Wonderland, 23. Februar 2015, 1:56
Desktop Pinner | ApplicationSettings | OnUtils -
-
Dann sind diese Framework Einschränkungen aber eher das geringste Problem.
Wenn LINQ schon vorhanden ist, dann sollte das auch genutzt werden, weils imho lesbarer ist. -
also ich finde so Bandwürmer iwann nicht mehr sonderlich lesbar.
sowas nicht:
Und sowas noch weniger:
ich steige am leichtesten durch die Codes von post#13 und post#15 durch. -
Was ist das Problem dabei? Ein Kommentar dazu, ausreichend testen und man hat eine performante, elegante, logische Lösung. Ich wüsste nicht, was dagegen spricht solch einfache Sachen direkt einzubauen, egal ob sie übersichtlich sind oder nicht. In einer in sich geschlossenen Funktion interessiert das eh keine Sau mehr, solange sie das tut, was man will.
Viele Grüße
~blaze~ -
~blaze~ schrieb:
Habe beim zweiten mal j statt i geschrieben. Ist aber symmetrisch zum ersten (((result >> j) & 1u) << i) statt ((result >> j) & 1u) << j.
Viele Grüße
~blaze~
Hey
Deine Lösung scheint aber immer noch nicht richtig zu funktionieren, - oder ich verwechsle irgendwas:
(Die sollten eigentliche alle 6 gesetzte Bits haben, da ich das in der Main() function so angegeben habe)
C# Developer
Learning C++
-
~blaze~ schrieb:
Ein Kommentar dazu -
ErfinderDesRades schrieb:
~blaze~ schrieb:
Ein Kommentar dazu
Ich glaube, immer noch nicht
Probier das mal aus:
C#-Quellcode
- public static uint GenerateUInt32(int n)
- {
- if (n == 0)
- return 0;
- if (n < 0 || n > 32)
- throw new ArgumentOutOfRangeException("n");
- uint result = 0xffffffffu >> (32 - n);
- for (int i = 1; i < 32; i++)
- {
- int j = rnd.Next(0, 32);
- result = (result & ~((1u << i) | (1u << j))) | (((result >> i) & 1u) << j) | (((result >> j) & 1u) << j);
- }
- return result;
- }
Du wirst sehen das die Zahlen nicht alle 6 gesetzte Bits haben.C# Developer
Learning C++
-
-
ErfinderDesRades schrieb:
ja, ich probiers grade, und stelle fest, zumindest die Bits 0, 30 tauscht das nicht
also verstehe ich den Sinn falsch, oder der Code ist falsch.
Warten wir mal, vllt hat @~blaze~ ja ne Idee was an seiner funktion falsch istC# Developer
Learning C++
-
C#-Quellcode
- public static uint GenerateUInt32(this Random random, int n)
- {
- if (random == null)
- throw new ArgumentNullException("random");
- if (n < 0 || n > 32)
- throw new ArgumentOutOfRangeException("n");
- if (n == 0)
- return 0;
- if (n == 32)
- return ~0u;
- uint result = ~(~0u >> n);
- for (int i = 1; i < 32; i++)
- {
- int j = random.Next(0, 32);
- result = (result & ~((1u << i) | (1u << j))) | (((result >> j) & 1u) << i) | (((result >> i) & 1u) << j);
- }
- return result;
- }
By the way: Die Vollzitate weglassen, bitte.
Hier der Testcode:
C#-Quellcode
- Random rnd = new Random();
- while (true)
- {
- int n;
- string line = Console.ReadLine();
- if (line == string.Empty)
- break;
- else if (!int.TryParse(line, out n) || n < 0 || n > 32)
- {
- Console.WriteLine("Enter number in range 0-32.");
- continue;
- }
- for (int i = 0; i < 9; i++)
- {
- line = System.Convert.ToString(rnd.GenerateUInt32(n), 2);
- Console.WriteLine(line.PadLeft(32, '0') + " - " + line.Count((c) => c == '1').ToString());
- }
- }
Viele Grüße
~blaze~Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „~blaze~“ ()
-
-
-
-
Ähnliche Themen
-
5 Benutzer haben hier geschrieben
- Rikudo (11)
- ErfinderDesRades (9)
- ~blaze~ (7)
- Gast (5)
- Niko Ortner (4)