相信看过三体的朋友,不会忘记黑暗森林法则,我是个程序员,一时心血来潮,花了3个小时做了如下程序来模拟黑暗森林法则,由于很多细节无法使用简单的程序模拟加之时间仓促,所以结果仅供娱乐讨论。不过经过反复运算,还是发现如下结果:
1、不论是延长宇宙时间或者是增加接触机会,剩余文明总数始终保持在50以下
2、剩余文明等级达到80以上的基本在10左右
3、出现越早的文明生存的概率越大,前提是没有被人发现。
下面是代码部分,欢迎补充建议:
class Civilization
{
//文明程度
private int level;
public int Level
{
get { return level; }
set
{
if (value > 100)
level = 100;
else
level = value;
if (level > 80)
{
this.consume = Convert.ToInt64(Math.Pow(2, level - 80));
}
}
}
//能量物质消耗
private long consume;
public long Consume
{
get { return consume; }
}
public bool IsSpite { get; set; }//是否恶意,默认善意
public bool IsLive { get; set; }//是否存在
public bool IsMember { get; set; }//和平成员
public Civilization(int level)
{
this.Level = level;
this.IsLive = true;
this.IsMember = false;
}
/// <summary>
/// 判断对方是否善意
/// </summary>
/// <param name="civ"></param>
/// <param name="i">猜疑链层级</param>
/// <returns>true 恶意,false善意</returns>
public bool Judge(Civilization civ,int i)
{
i++;
if (i >= 10)
{
return true;//如果猜疑链超过10级,认为对方是恶意的
}
if (civ.IsSpite == true)//对方是恶意的
{
return true;
}
else//对方是善意的
{
return civ.Judge(this,i);
}
}
/// <summary>
/// 我知道了对方的存在
/// </summary>
/// <param name="civ"></param>
public void Touch(Civilization civ)
{
if (Judge(civ, 0))//如果对方恶意
{
Console.WriteLine("尝试攻击对方");
Attack(civ);
}
else
{
Console.WriteLine("共建和平");
Peace(civ);
}
}
public void Peace(Civilization civ)
{
this.IsMember = true;
civ.IsMember = true;
}
public void Attack(Civilization civ)
{
if (this.Level >= 95)
civ.IsLive = false;//消灭对方
}
}
static void Main(string[] args)
{
int iCivNum = 100;//文明总数初始值100
const long Matter = 20000000000000;//宇宙中物质总量
//初始化文明总量
List<Civilization> list = new List<Civilization>();
Random r = new Random();
for (int j = 0; j < iCivNum; j++)
{
list.Add(new Civilization(r.Next(1, 100)));
}
int iCount = list.Count;//文明总数
long mat = 0;
//模拟时间
for (int i = 1; i < 100000; i++)
{
//时间推移,文明级别提升
if (i % 10 == 0)
{
//新的文明出现
list.Add(new Civilization(r.Next(1, 100)));
iCount++;
//文明进化
foreach (Civilization c in list)
{
c.Level ++;//每过10年,文明级别+1
mat += c.Consume;
}
//文明接触
for (int j = 0; j < 2; j++)
{
int flag = 0;
if (list.Count <= 1)//如果仅剩一个文明不再接触
break;
int a = r.Next(0, list.Count);
while (list[a].Level < 80)//如果文明级别不到80,无法接触
{
if (flag > list.Count)//如果文明集合中的没有级别超过80的会造成死循环,所以随机数达到集合总数,就退出
break;
flag++;
a = r.Next(0, list.Count);
}
int b = r.Next(0, list.Count);
flag = 0;
while (list[b].Level < 80)
{
if (flag > list.Count)
break;
flag++;
b = r.Next(0, list.Count);
}
list[a].Touch(list[b]);
if (list[b].IsLive == false)
list.RemoveAt(b);//死亡的文明移出
}
}
if (mat >= Matter)
Console.WriteLine("宇宙毁灭");
}
int y = 0;
int x = 0;
foreach (Civilization c in list)
{
if (c.IsLive)
{
x++;
}
if (c.Level >= 80)
y++;
}
Console.WriteLine("存在过的文明总数"+iCount);
Console.WriteLine("剩余文明数量:"+x);
Console.WriteLine("文明级别达到80的总数是"+y);
x = 0;
foreach (Civilization c in list)
{
x++;
Console.WriteLine("文明{0}的级别是{1}",x,c.Level);
}
Console.ReadKey();
}
|
|