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();