使用一个随机数据类型但生成不同的结果?

时间:2017-12-30 14:11:42

标签: c# random

下面是我用来声明变量的代码:

Random x= new Random();
int xval;
string xresult;

xval = x.Next(4);
string[] xlist = {
    "ZERO",
    "ONE",
    "TWO",
    "THREE",
};
xresult = xlist[xval];

我的问题是,我使用它的结果是一样的。我希望每次更改或重置。

2 个答案:

答案 0 :(得分:0)

使用它时随机使用从DateTime.Now派生的种子进行初始化 - 您使用它生成0到4之间的数字(不包括) - 所以25%的时间你会得到相同的数字:

using System;
using System.Collections.Generic;

public class Program
{    
    public static void Main()
    {
        Random x= new Random();

        List<int> ints = new List<int>();

        for(int i=0; i< 100; i++) ints.Add(x.Next(4));

        Console.WriteLine(string.Join(", ",ints));
    }
}

输出(重新格式化):

3, 0, 1, 1, 1, 1, 3, 0, 2, 0, 1, 2, 1, 0, 3, 1, 3, 0, 2, 2, 3, 1, 1, 2, 1, 
2, 3, 3, 2, 3, 3, 2, 0, 3, 3, 3, 0, 0, 3, 0, 2, 1, 3, 3, 1, 0, 2, 1, 3, 0,
2, 2, 3, 3, 1, 1, 2, 3, 3, 2, 2, 0, 2, 2, 1, 2, 2, 1, 1, 3, 1, 3, 1, 2, 0,
2, 2, 1, 0, 1, 3, 1, 0, 1, 1, 1, 2, 0, 2, 1, 1, 0, 0, 0, 1, 2, 3, 0, 2, 2

它产生不同的。你只是不幸运。

您应该将声明Random x=new Random()(badname btw)移到您使用它之外的地方,这样您就不会一遍又一遍地创建声明,也许会为&#34;不同的&#34;根据你的时间种子。您可以在随机(偶然)的不同种子运行中使用相同的100位数字。随机并不意味着不同,特别是如果你只使用4个值将所有随机性映射到。

评论中的评论之后 - 说明&#34;相同&#34;不同随机种子的起始序列:

using System;
using System.Linq;
using System.Collections.Generic;

public class Program
{    

    static IEnumerable<int> FirstNumbersFromSeed(int seed, int num)
    {
        var r = new Random(seed);
        for (int i=0;i<num;i++)
            yield return r.Next(4);
    }

    public static void Main()
    {

        Dictionary<string,List<int>> dict = new Dictionary<string,List<int>>();

        int num = 5;
        for (int i =0;i<2000; i++)
        {
            var key = string.Join(",",FirstNumbersFromSeed(i,num));

            if (dict.ContainsKey(key)) dict[key].Add(i);
            else dict[key] = new List<int>(i);
        }

        foreach(var kvp in dict.Where(d => d.Value.Count > 1))
            Console.WriteLine(string.Join(", ",kvp.Key) + " same first " + num + " values for seed with ints: " + string.Join(",",kvp.Value));
    }
}

输出:

2,3,3,2,0 same first 5 values for seed with ints: 239,890
0,0,1,3,2 same first 5 values for seed with ints: 1463,1576
3,1,0,3,0 same first 5 values for seed with ints: 540,653,1876
1,1,1,2,1 same first 5 values for seed with ints: 656,769,895
<snipped 300  more output lines>
1,0,1,3,3 same first 5 values for seed with ints: 1862,1988

所以你有大约305次&#34;碰撞&#34;它提供相同的5个开始&#34;随机&#34;如果从0到4绘制随机值(不包括),则种子值介于0和2000之间。

答案 1 :(得分:0)

如果您只想从数组中提取随机值,请使用以下代码:

private static Random s_Random = new Random();

public static void Main(string[] args)
{
    String[] xlist =
    {
        "ZERO",
        "ONE",
        "TWO",
        "THREE"
    };

    Int32 idx;

    for (Int32 i = 0; i < 10; ++i)
    {
        idx = s_Random.Next(xlist.Length);
        Console.WriteLine(xlist[idx]);
    }
}

请注意,创建唯一的Random实例非常重要,并且每次需要随机数时都要重复使用它,以实现生成数字的一致性。

您可以尝试一个有效的演示here