我在F#中有以下功能:
let randomCh () =
let random = Random()
alph.Chars (random.Next (alph.Length - 1));
Run Code Online (Sandbox Code Playgroud)
此函数每次都返回相同的值.我在C#中遇到同样的问题,解决方案很简单:只创建一个这样的Random对象:
var rnd = new Random();
for (int i = 0; i < 10; i++)
Console.WriteLine(rnd.Next(10));
Run Code Online (Sandbox Code Playgroud)
如何在F#中达到相同的行为:每次获取随机值?
那么你的C#代码没有定义函数而你的F#没有定义函数; 你可能在C#中遇到同样的问题.您应该random从randomCh函数中重构定义,或者randomCh在初始化后绑定到函数random:
let alph = "abcdefg"
let randomCh =
let random = Random()
fun () -> alph.Chars (random.Next (alph.Length - 1))
printfn "%O" <| randomCh()
printfn "%O" <| randomCh()
Run Code Online (Sandbox Code Playgroud)
就像在C#中一样,你应该在函数外部创建随机函数.这将阻止您在Random每次调用时创建新的生成器.默认情况下,Random使用当前系统时钟播种自身 - 如果您使用随机实例调用函数,快速连续,您可以使用相同的时间戳为随机播种,从而有效地为您提供相同的序列.
通过将其移出函数,您将重用相同的随机实例,并避免:
let random = Random()
let randomCh () =
alph.Chars (random.Next (alph.Length - 1));
// Calling randomCh() repeatedly will now give different values each time
Run Code Online (Sandbox Code Playgroud)