里面就两种功能
一种是排除掉一定范围内的数
另一种是在一个数组中,基于权重随机生成一个索引
csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 随机工具
/// </summary>
public class RandomTool
{
/// <summary>
/// 在一个范围中随机,但是排除掉一小个范围
/// </summary>
/// <param name="includeMin"></param>
/// <param name="excludeMax"></param>
/// <param name="blackMin">排除范围的最小值</param>
/// <param name="blackMax">排除范围的最大值,会包括这个值</param>
/// <returns></returns>
public static int Range(int includeMin, int excludeMax, int blackMin, int blackMax)
{
if(blackMin < includeMin || blackMin > excludeMax)
{
Debug.LogError("随机数范围异常!");
return includeMin;
}
if(blackMax < blackMin || blackMax > excludeMax)
{
Debug.LogError("随机数范围异常!");
return includeMin;
}
int random1 = Random.Range(includeMin, blackMin);
int random2 = Random.Range(blackMax + 1, excludeMax);
if(Random.Range(0, 2) == 0)
{
return random1;
}
else
{
return random2;
}
}
/// <summary>
/// 在一个范围中随机,但是排除掉一小个范围
/// </summary>
/// <param name="includeMin"></param>
/// <param name="excludeMax"></param>
/// <param name="blackMin">排除范围的最小值</param>
/// <param name="blackMax">排除范围的最大值,会包括这个值</param>
/// <returns></returns>
public static float Range(float includeMin, float excludeMax, float blackMin, float blackMax)
{
if (blackMin < includeMin || blackMin > excludeMax)
{
Debug.LogError("随机数范围异常!");
return includeMin;
}
if (blackMax < blackMin || blackMax > excludeMax)
{
Debug.LogError("随机数范围异常!");
return includeMin;
}
float random1 = Random.Range(includeMin, blackMin);
float random2 = Random.Range(blackMax + Mathf.Epsilon, excludeMax);
if (Random.Range(0, 2) == 0)
{
return random1;
}
else
{
return random2;
}
}
/// <summary>
/// 在一组权重中随机找一个索引
/// </summary>
/// <param name="weightArray">权重数组,需要递增</param>
/// <returns></returns>
public static int RandomIndex(int[] weightArray)
{
int allWeight = 0;
for(int i = 0; i < weightArray.Length; i++)
{
allWeight += weightArray[i];
}
int randomWeight = Random.Range(0, allWeight);
int index = 0;
int tempWeight = 0;
for(int i = 0; i < weightArray.Length; i++)
{
tempWeight += weightArray[i];
if(tempWeight > randomWeight)
{
index = i;
break;
}
}
return index;
}
/// <summary>
/// 在一组权重中随机找一个索引
/// </summary>
/// <param name="weightArray">权重数组,需要递增</param>
/// <returns></returns>
public static int RandomIndex(float[] weightArray)
{
float allWeight = 0;
for (int i = 0; i < weightArray.Length; i++)
{
allWeight += weightArray[i];
}
float randomWeight = Random.Range(0, allWeight);
int index = 0;
float tempWeight = 0;
for (int i = 0; i < weightArray.Length; i++)
{
tempWeight += weightArray[i];
if (tempWeight > randomWeight)
{
index = i;
break;
}
}
return index;
}
}
一般的权重用法:
csharp
int[] randomNum = new int[] { -11, 999, 10, 66 };
int[] weight = new int[] { 5, 5, 10, 80 };
int[] test = new int[randomNum.Length];
for (int i = 0; i < 1000000; i++)
{
int index = RandomTool.RandomIndex(weight);
test[index]++;
}
for (int i = 0; i < test.Length; i++)
{
Debug.Log($"{randomNum[i]}一共出现了{test[i]}次");
}