/*********************************************************************************
*Copyright(C) 部分来自网络
*All rights reserved.
*FileName: RandomUtil.cs
*Author: zhiheng.shao
*Version: 1.0
*UnityVersion:5.3.3f1
*Date: 2016-03-30
*Description:
*History:
**********************************************************************************/
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
namespace RickShao
{
public static class RandomUtil
{
/// <summary>
/// 随机无权重地返回一个fromList中的元素
/// </summary>
/// <param name="fromList"></param>
/// <returns></returns>
public static T GetRandomMemberFromList<T>(List<T> fromList)
{
int index = Random.Range(0, fromList.Count);
return fromList[index];
}
/// <summary>
/// 随机选择具有不同概率的事件
/// </summary>
/// <param name="Probs">概率数组</param>
/// <returns>数组index(从0开始计数)</returns>
public static float Choose(float[] probs)
{
//将事件元素加入到数组中,如上面有4个元素,分别为50,25,20,5
float total = 0;
foreach (float elem in probs)
{
total += elem;
}
float randomPoint = Random.value * total;
for (int i = 0; i < probs.Length; i++)
{
if (randomPoint < probs[i])
return i;
else
randomPoint -= probs[i];
}
return probs.Length - 1;
}
/// <summary>
/// 洗牌
/// </summary>
/// <des>
/// 依次将数组内的每个元素与一个随机序号的元素进行交换
/// </des>
/// <param name="cards"></param>
public static int[] Shuffle(int[] cards)
{
for (int i = 0; i < cards.Length; i++)
{
int temp = cards[i];
int randomIndex = Random.Range(0, cards.Length);
cards[i] = cards[randomIndex];
cards[randomIndex] = temp;
}
return cards;
}
/// <summary>
/// 使用随机数在数组中无重复的选择元素
/// </summary>
/// <des>
/// 个球队10个人,要选择5个人去参加比赛。
/// 在游戏中的应用场景为你希望在几个不同的点随机生成一个不相同的NPC。
/// 例如需要在10个NPC中随机选择5个,
/// 第一个NPC被选中的概率为5/10,
/// 如果第一个被选中了那么第二个被选中的概率就变成了4/9,
/// 如果第一个被淘汰那么第二个被选中的概率就为5/9
/// </des>
/// <typeparam name="T"></typeparam>
/// <param name="numRequired"></param>
/// <param name="spawnPoints"></param>
/// <returns></returns>
public static T[] ChooseSet<T>(int numRequired, T[] spawnPoints)
{
T[] result = new T[numRequired];
int numToChoose = numRequired;
for (int numLeft = spawnPoints.Length; numLeft > 0; numLeft--)
{
float prob = ((float)numToChoose) / ((float)numLeft);
if (Random.value < prob)
{
numToChoose--;
result[numToChoose] = spawnPoints[numLeft - 1];
if (numToChoose == 0)
break;
}
}
return result;
}
// <summary>
/// 返回[0,1)之间随机数, 数值越大返回的概率越大的,
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="numRequired"></param>
/// <param name="spawnPoints"></param>
/// <returns></returns>
public static float Montecarlo(){
while (true)
{
float r1 = Random.Range(0, 1);
float probability = r1;
float r2 = Random.Range(0, 1);
if (r2 < probability)
return r1;
else
return r2;
}
}
}
}
【数学】随机相关的函数
最新推荐文章于 2022-01-07 17:35:55 发布