Я бы предложил использовать .Net Случайный класс для генерации случайных чисел. Это также проще в использовании.
Найдите первое случайное число между 0
и минимальным значением, тогда второе случайное число будет в диапазоне: randomMin(MinValue) => (MinValue - randomMin, MaxValue - randomMin)
:
randomMin = rnd1.Next(Min + 1)
randomMax = rnd2.Next(Min - randomMin, Max - randomMin + 1)
result = randomMin + randomMax
К помните, что в классе Random верхний предел является исключительным, поэтому нам нужно добавить 1 к значению Max, чтобы включить его в диапазон случайных значений.
Выполните пример теста:
( В этих примерах кода предполагается, что используемая версия VB.Net - не менее V.14, VS 2015+ )
Private rnd1 As Random = New Random()
Private rnd2 As Random = New Random()
'(...)
Dim Min As Integer = 120
Dim Max As Integer = 235
For i = 0 To 100
Dim randomValues = GetRandomNumbersInRange(Min, Max)
Console.WriteLine($"Random Min: {randomValues.rndMin} Random Max {randomValues.rndMax}")
Console.WriteLine($"Sum: {randomValues.rndMin + randomValues.rndMax}")
Next
'(...)
Private Function GetRandomNumbersInRange(Min As Integer, Max As Integer) As
(rndMin As Integer, rndMax As Integer)
Dim randomMin As Integer = rnd1.Next(Min + 1)
Return (randomMin, rnd2.Next(Min - randomMin, Max - randomMin + 1))
End Function
Если вы хотите, чтобы метод напрямую возвращал сумму, вы можете изменить тип возврата метода следующим образом:
Dim Min As Integer = 120
Dim Max As Integer = 235
For i = 0 To 100
Console.WriteLine(GetSumRandomNumbersInRange(Min, Max))
Next
'(...)
Private Function GetSumRandomNumbersInRange(Min As Integer, Max As Integer) As Integer
Dim randomMin As Integer = rnd1.Next(Min + 1)
Return randomMin + rnd2.Next(Min - randomMin, Max - randomMin + 1)
End Function
Случайные числа также могут быть выбран с:
randomMid(MaxValue - MinValue) => (MinValue, MaxValue - randomMid)
В этом случае, возможно, реализовано как:
Private Function GetSumRandomNumbersInRange2(Min As Integer, Max As Integer) As Integer
Dim randomFirst As Integer = rnd1.Next(Max - Min + 1)
Return randomFirst + rnd2.Next(Min, Max - randomFirst + 1)
End Function
Это очень просто сделать с моей единицей TGpTextFile. Я соединю краткий образец и отправлю его здесь.
Это должно также быть очень просто с новым Delphi 2009 - Вы, возможно, используете его?
Править: Это его, как можно сделать это с помощью моего материала в пред2009 Delphis.
var
strAnsi : TGpTextFile;
strUnicode: TGpTextFile;
begin
strAnsi := TGpTextFile.Create('c:\0\test.udl');
try
strAnsi.Reset; // you can also specify non-default 8-bit codepage here
strUnicode := TGpTextFile.Create('c:\0\test-out.udl');
try
strUnicode.Rewrite([cfUnicode]);
while not strAnsi.Eof do
strUnicode.Writeln(strAnsi.Readln);
finally FreeAndNil(strUnicode); end;
finally FreeAndNil(strAnsi); end;
end;
Лицензия: фрагмент кода выше принадлежит общественному достоянию. Используйте его так или иначе, Вам нравится.
Хорошо, с помощью Дельфи 2009, я смог придумать следующий код, который, кажется, работает, но действительно ли это - надлежащий способ сделать это преобразование?
var
sl : TStrings;
FileName : string;
begin
FileName := fServerDir+'configuration\hdconfig4.udl';
sl := TStringList.Create;
try
sl.LoadFromFile(FileName, TEncoding.Default);
sl.SaveToFile(FileName, TEncoding.Unicode);
finally
sl.Free;
end;
end;