Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 存储一个数字并在每次调用该方法时递增_C#_Random - Fatal编程技术网

C# 存储一个数字并在每次调用该方法时递增

C# 存储一个数字并在每次调用该方法时递增,c#,random,C#,Random,我正在尝试让我的扭曲方法执行以下操作: 存储一个数字(结果) 生成一个随机数并将其添加到结果中 到目前为止,我掌握的代码是: 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(re

我正在尝试让我的扭曲方法执行以下操作:

存储一个数字(结果)
生成一个随机数并将其添加到结果中
到目前为止,我掌握的代码是:

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方法时递增。

尝试:

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
都会增加它,而不会每次重置它。

取决于“存储它”的含义。在哪里分类?全球的?档案?数据库?我猜你是指一个全局变量,在这种情况下,将结果变量声明在twist方法的范围之外

这里有一个简洁的小方法,只要你迭代
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 IEnumerable Twist(int-min,int-max){
随机=新随机();
int结果=0;
while(true){
result+=random.Next(最小值,最大值);//对于较大的最大值,很可能出现溢出
系统.诊断.调试.写入线(结果);
收益结果;
}
}
//对于单个元素
int oneResult=Twist(1,5).First();
//第五次
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());
}
公共静态类枚举器ext{
公共静态T Next(此IEnumerator序列){
if(seq.MoveNext()){
返回序列当前值;
}
返回默认值(T);
}
}
//现在就这么说吧!
使用(var生成器=Twist(5,10).GetEnumerator(){
Console.WriteLine(generator.Next());
Console.WriteLine(generator.Next());
Console.WriteLine(generator.Next());
Console.WriteLine(generator.Next());
}
将“结果”存储在方法之外。我还倾向于使随机生成器保持静态,因为它有记住每次呼叫时生成的号码的倾向

最好保持Random静态,因为正如Marc Gravell所说,“每次执行new Random()时,它都是使用时钟初始化的。这意味着在一个紧密循环中,您会多次获得相同的值。您应该保持一个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;
}
基本上,您需要在方法外部声明
result
,这样就不会每次都创建它并将其设置为零

注意:如果您在.aspx.cs文件中工作,您可能还需要将其声明为
静态
(或会话变量),否则它将在网页上发生的每个操作中重置


注2:Random是静态的,因为每个实例都取决于系统时钟,所以您只需要有一个实例,然后在该实例上调用
。Next(min,max)
,以获得另一个随机数。

@tsells:嗯,不太可能,没有。你从哪里得到命名约定的?@minitech-这是区分类级变量和局部变量的常用方法。它使代码更清晰,更易于阅读。这不是必需的,但建议使用。@minitech-你来自VB世界吗?我讨厌在代码中看到这个.variable,除非您与基类一起使用它来区分to值。@tsells,请注意,您使用下划线前缀的建议是反对的,所以不要太惊讶,不是每个人都这样做。@AlexeiLevenkov它说不使用??它说不要使用前缀,比如m_fieldname而不是_fieldname。下面是一个例子,说明我为什么这样使用它(和其他许多人一样)。请检查以下答案以正确使用随机选项:+0。若你们有关于随机静电的解释,这将是完整的答案。看看。@AlexeiLevenkov说得好,谢谢你提醒我,尽管我从来没有真正研究过它这样做的原因。
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;
}