Zufallszahlen mit Security.Cryptography

19/02/2009 - 17:00 von Ulrich Hauer | Report spam
Hallo NG,

ich habe versucht einen C# Code auf VB.NET abzuàndern, aber das gestaltet
sich schwieriger als zunàchst angenommen... Wenn ich als Untergrenze 1 und
Obergrenze 6 angebe, dann passiert es trotzdem ab und zu, daß eine 7 erzeugt
wird. Das passiert im C# original aber anscheinend nicht. Könnt ihr mir
sagen, was ich falsch übersetzt habe? Vielen Dank an alle die antworten!

Anmerkung: Das Byte-Feld Numbers habe ich in VB um -1 verkleinert, da
(zumindest in VB) Felder 0-basiert sind. Sonst kommt ein Wert mehr als
"Count" zurück.

C#
____
using System;
using System.Security.Cryptography;

public static byte[] GetRandomNumbers(int count, byte min, byte max)
{
// Zufallszahlen erzeugen
RNGCryptoServiceProvider csp = new RNGCryptoServiceProvider();
byte[] numbers = new Byte[count];
csp.GetBytes(numbers);

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

VB.NET
___
Public Function GetRandomNumbers(ByVal Count As Integer, ByVal Min As
Byte, ByVal Max As Byte) As Byte()
'Zufallszahlen erzeugen
Dim csp As RNGCryptoServiceProvider = New RNGCryptoServiceProvider
Dim Numbers(Count - 1) As Byte
csp.GetBytes(Numbers)

'Die Zahlen umrechnen
Dim Divisor As Double = 265.0F / (Max - Min + 1)

If Min > 0 Or Max < 255 Then
For i As Integer = 0 To Count - 1
Numbers(i) = CType(((Numbers(i) / Divisor) + Min), Byte)
Next
End If

Return Numbers
End Function
___

Danke,

Ulrich
 

Lesen sie die antworten

#1 Peter Fleischer
19/02/2009 - 18:30 | Warnen spam
"Ulrich Hauer" schrieb im Newsbeitrag
news:gnjvnb$u09$03$
Hallo NG,

ich habe versucht einen C# Code auf VB.NET abzuàndern, aber das gestaltet
sich schwieriger als zunàchst angenommen... Wenn ich als Untergrenze 1 und
Obergrenze 6 angebe, dann passiert es trotzdem ab und zu, daß eine 7
erzeugt wird. Das passiert im C# original aber anscheinend nicht. Könnt
ihr mir sagen, was ich falsch übersetzt habe? Vielen Dank an alle die
antworten!
...



Hi Ulrich,
in C# wird abgeschnitten, in VB mathematisch gerundet. Um das gleiche
Ergebnis zu erzielen, musst du in VB die Int-Funktion anwenden.

Viele Grüsse
Peter

Ähnliche fragen