存储一个数字并在每次调用该方法时递增它
本文关键字:调用 方法 一个 数字 存储 | 更新日期: 2023-09-27 18:31:15
我正在尝试让我的扭曲方法执行以下操作:
存储数字(结果)
生成一个随机数并将其添加到结果
中到目前为止,我的代码是:
public int twist(int min, int max)
{
int result = 0;
Random random = new Random();
int y = random.Next(min, max);
result += y;
System.Diagnostics.Debug.WriteLine(result);
return result;
}
它所做的只是每次生成一个新数字,因为我没有存储它,我认为我不需要循环,但我需要在每次 y 增量后存储结果,并且 y 应该只在每次调用 twist 方法时递增。
将"结果"存储在方法之外。我也倾向于使随机生成器成为静态的,并且它倾向于记住每次调用时生成的数字。
最好将 Random 保持静态,因为正如 Marc Gravell 所说:"每次你做新的 Random() 时,它都是使用时钟初始化的。这意味着在紧密循环中,您可以多次获得相同的值。您应该保留一个随机实例,并在同一实例上继续使用 Next。
查看 - 随机数生成器仅生成一个随机数以获取更多信息和报价来源。
private int _result = 0;
private static Random _rand = new Random();
public int twist(int min, int max)
{
int y = _rand.Next(min, max);
_result += y;
System.Diagnostics.Debug.WriteLine(_result);
return _result;
}
尝试:
private int result;
private Random random = new Random();
public int twist(int min, int max)
{
int y = random.Next(min, max);
result += y;
System.Diagnostics.Debug.WriteLine(result);
return result;
}
由于result
需要通过对同一方法的多次调用来访问,因此需要将其放入字段而不是变量中。在您的版本中,每次调用twist
都会创建一个新变量并将其设置为 0。如果将其提取到字段中,则在创建对象时将其初始化为 0,并且每次调用 twist
都会递增它,而不会每次重置它。
private static int result = 0;
private static Random random = new Random();
public int twist(int min, int max)
{
int y = random.Next(min, max);
result += y;
System.Diagnostics.Debug.WriteLine(result);
return result;
}
基本上,您需要在方法外部声明result
,这样就不会每次都创建它并将其设置为零。
注意:如果您正在使用.aspx.cs文件,则可能还需要将其声明为static
(或会话变量),否则它将在网页上发生的每个操作时重置。
注意 2:随机是静态的,因为每个实例都取决于系统时钟,因此您只有一个实例并在该实例上调用 .Next(min, max)
以获取另一个随机数。
这是一个简洁的小方法,只要您迭代IEnumerable
,它就会返回任意数量的随机数的总和。
public IEnumerable<int> Twist(int min, int max) {
Random random = new Random();
int result = 0;
while (true) {
result += random.Next(min, max); // overflow pretty likely for large max
System.Diagnostics.Debug.WriteLine(result);
yield return result;
}
}
// For a single element
int oneResult = Twist(1, 5).First();
// For the fifth
int fifth = Twist(1, 5).Skip(4).First();
如果你想推迟迭代,只是为了踢,给自己定义一个很好的扩展方法:
public static class EnumeratorExt {
public static T Next<T> (this IEnumerator<T> seq) {
if (seq.MoveNext()) {
return seq.Current;
}
return default(T);
}
}
// Now call it like so!
using (var generator = Twist(5, 10).GetEnumerator()) {
Console.WriteLine(generator.Next());
Console.WriteLine(generator.Next());
Console.WriteLine(generator.Next());
Console.WriteLine(generator.Next());
}
取决于你所说的"存储它"是什么意思。在哪里排序?全球?文件?数据库?我猜你的意思是全局,在这种情况下,在 twist 方法的范围之外声明你的结果变量