Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.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#_Unity3d - Fatal编程技术网

C# 如何在一个数组中比其他随机数多生成一个随机数?

C# 如何在一个数组中比其他随机数多生成一个随机数?,c#,unity3d,C#,Unity3d,我有一个数字列表,例如:{1,2,3,4,5,6} 我想随机生成这些数字,我是这样做的: void Update(){ float ran = Random.Range(1,6); print(ran); } Dictionary<double, Tuple<int, int>> weights = new Dictionary<double, Tuple<int, int>>(); weights.Add(80, new Tup

我有一个数字列表,例如:
{1,2,3,4,5,6}

我想随机生成这些数字,我是这样做的:

void Update(){
    float ran = Random.Range(1,6);
    print(ran);
}
Dictionary<double, Tuple<int, int>> weights = new Dictionary<double, Tuple<int, int>>();
weights.Add(80, new Tuple<int, int>(1, 100));
weights.Add(20, new Tuple<int, int>(3,3));

var randgen = new RandomGenerator(weights);
var number = randgen.GetRandomNumber();
如何生成或打印比其他数字多3个数字?

如果您想要倾斜分布,您可以(比如)将生成的值映射到所需的分布

// all 1..6 are equal with exception of 3 which appears more frequently 
// 1..2, 4..6 - 10% each (1 occurence  per 10 items)
// 3          - 50%      (5 occurences per 10 items)
private static int[] map = new int[1, 2, 3, 4, 5, 6, 3, 3, 3, 3];

...

void Update{
  float ran = map[Random.Range(map.Length)];
  print(ran);
}
如果您想要倾斜分布,您可以(比如)将生成的值映射到所需的分布

// all 1..6 are equal with exception of 3 which appears more frequently 
// 1..2, 4..6 - 10% each (1 occurence  per 10 items)
// 3          - 50%      (5 occurences per 10 items)
private static int[] map = new int[1, 2, 3, 4, 5, 6, 3, 3, 3, 3];

...

void Update{
  float ran = map[Random.Range(map.Length)];
  print(ran);
}

这里有一些解决方案,使用概率论,但它被过度设计了。它也可能有一些小的语法错误,因为我现在离VisualStudio很远(

var data=newfloat[]{1,2,3,4,5,6};
var指数加权=(指数)=>{
如果(索引==3)返回2;
返回1;
};
var total=数据。选择((值,索引)=>IndexToWight(索引)).Sum();
var-weightedData=data.Select((value,index)=>Tuple.Create(value,indexToWeight(index)/(float)sum)).ToList();
var boundedData=新列表(weightedData.Count);
浮动范围=0.0f;
for(int i=0;i{
变量对=wv.FirstOrDefault(item=>item.Item2>p);
if(pair!=null)返回pair.Item1;
返回vw.Last().Item1;
}; 
随机;
var randomizedData=Enumerable.Range(1,data.Count)。选择(index=>weightedtoValue(weightedData,random.NextDouble()).ToArray();

这里有一些解决方案,使用概率论,但它太过复杂。它也可能有一些小的语法错误,因为我现在离visual studio很远(

var data=newfloat[]{1,2,3,4,5,6};
var指数加权=(指数)=>{
如果(索引==3)返回2;
返回1;
};
var total=数据。选择((值,索引)=>IndexToWight(索引)).Sum();
var-weightedData=data.Select((value,index)=>Tuple.Create(value,indexToWeight(index)/(float)sum)).ToList();
var boundedData=新列表(weightedData.Count);
浮动范围=0.0f;
for(int i=0;i{
变量对=wv.FirstOrDefault(item=>item.Item2>p);
if(pair!=null)返回pair.Item1;
返回vw.Last().Item1;
}; 
随机;
var randomizedData=Enumerable.Range(1,data.Count)。选择(index=>weightedtoValue(weightedData,random.NextDouble()).ToArray();

对于正态分布,将threeMultiplier设置为1;对于两倍以上的3,将threeMultiplier设置为2;对于三倍以上的3,将threeMultiplier设置为3,依此类推

void Update() {
    int threeMultiplier = 2; // Twice as much 3's
    int maxNumber = 6;
    int num = Random.Range(1, threeMultiplier * maxNumber);
    if (num > maxNumber) num = 3;
    print(num); 
}

对于正态分布,将threeMultiplier设置为1;对于两倍以上的3,将threeMultiplier设置为2;对于三倍以上的3,将threeMultiplier设置为3,依此类推

void Update() {
    int threeMultiplier = 2; // Twice as much 3's
    int maxNumber = 6;
    int num = Random.Range(1, threeMultiplier * maxNumber);
    if (num > maxNumber) num = 3;
    print(num); 
}
“掷骰子黑客”的一个解决方案是: 浮动运行=随机范围(1,10)

“将ran转换为int”

因此,您将有50%的机会使用3,并且彼此有10%的机会将3-s的数量更改为较小的值^^

一种“掷骰子黑客”解决方案可以是: 浮动运行=随机范围(1,10)

“将ran转换为int”


因此,您将有50%的机会使用3,彼此使用10%的机会,将3-s的数量更改为较小的值^^

检查我在.Net fiddle中制作的示例。 在这段代码中,您有两种可能。 我很确定这解决了你的问题,这是一个非常简单的解决方案。 当然,在Unity中,你可能想使用Random.Range…更改一些Var的名字

1-您可以打印列表中元素的次数,因此包含“n”个元素的列表将始终打印“n”个数字作为输出

2-只要更改变量
timesToPrint

代码将根据
chanceToPrintGoldenNumber
打印
黄金编号
,否则它会打印列表上的随机元素(可能是偶然的黄金编号)

示例链接

代码:

publicstaticvoidmain()
{
随机rnd=新随机();
var li=新列表{1,2,5,3,6,8};
var timesToPrint=10;
var goldenNumber=3;
//这实际上是55%的几率,因为我们从0到100生成一个数字,如果它大于45,我们就打印它…所以55%的几率
var chanceToPrintGoldenNumber=45;
//打印次数与列表上的数字相同
WriteLine(“打印列表中元素的次数”);
foreach(变量编号,单位为li)
{       
变量goldenNumberChance=rnd.Next(0100);
if(goldenNumberChance>chanceToPrintGoldenNumber)//55%的机会打印goldenNumber
{
控制台写入线(金色编号);
}
其他的
{           
var i=rnd.Next(0,li.Count);
Console.WriteLine(li[i]);
}
}
Console.WriteLine(“*************************结束****************************************”);
//打印次数与“timesToPrint”的值相同。
Console.WriteLine(“打印次数与TimesTopPrint上的值相同”);
对于(变量i=0;ichanceToPrintGoldenNumber)//55%的机会打印goldenNumber
{
控制台写入线(金色编号);
}
其他的
{           
var n=rnd.Next(0,li.Count);
Console.WriteLine(li[n]);
}
}
}

检查我在.Net fiddle中制作的示例。 在这段代码中,您有两种可能。 我很确定这解决了你的问题,这是一个非常简单的解决方案。 当然,在Unity中,你可能想使用Random.Range…更改一些Var的名字

1-您可以打印列表中元素的次数,因此包含“n”个元素的列表将始终打印“n”个数字作为输出

2-你可以打印任何你想要的弹药,只要你
public class RandomGenerator
{
    Dictionary<Tuple<double, double>, Tuple<int, int>> probability;
    Random random;

    public RandomGenerator(Dictionary<double, Tuple<int, int>> weights)
    {
        random = new Random();

        Dictionary<double, Tuple<int, int>> percent = weights.Select(x => new { Key = x.Key / weights.Keys.Sum(), Value = x.Value }).ToDictionary(t => t.Key, t => t.Value);
        probability = new Dictionary<Tuple<double, double>, Tuple<int, int>>();
        double last = 0;
        foreach (var item in percent.OrderBy(x => x.Key).Select(x => new { Key = x.Key, Value = x.Value }))
        {
            probability.Add(new Tuple<double, double>(last, last + item.Key), item.Value);
            last += item.Key;
        }
    }

    public double GetRandomNumber()
    {
        double w = random.NextDouble();

        var range = probability.Where(x => w >= x.Key.Item1 && w <= x.Key.Item2).First().Value;

        return random.Next(range.Item1, range.Item2);
    }
}
Dictionary<double, Tuple<int, int>> weights = new Dictionary<double, Tuple<int, int>>();
weights.Add(80, new Tuple<int, int>(1, 100));
weights.Add(20, new Tuple<int, int>(3,3));

var randgen = new RandomGenerator(weights);
var number = randgen.GetRandomNumber();