用C++写一个算法。有4个等级的玩家,每种玩家进一次游戏就会随机获得或减少一定的分数,最终的目的是
答案:2 悬赏:0 手机版
解决时间 2021-04-24 04:34
- 提问者网友:雪舞兮
- 2021-04-23 11:20
用C++写一个算法。有4个等级的玩家,每种玩家进一次游戏就会随机获得或减少一定的分数,最终的目的是达到3000分就算成功。要求:第一个等级的玩家很容易就能达到3000分,第二个等级的玩家要重复很多次才能达到3000分,第三个等级的玩家是感觉有希望能达到3000分,但实际却是没法达到,第四个等级的玩家直接就能知道,无论进多少次游戏,都没法完成。注意,玩家的每次的分数不能只增不减或只减不增。急。。。帮帮忙,兄弟!
最佳答案
- 五星知识达人网友:忘川信使
- 2021-04-23 12:16
完整代码如下:
编译器:VS2012.
原理:生成随机数,从随机数分布概率着手设定达标速度与胜率.现在的胜率设置比较极端,请自行调整。
#include
#include
using namespace std;int randNum(int rangeMin,int rangeMax)
{
return static_cast(rand())/(RAND_MAX+1)*(rangeMax-rangeMin+1)+rangeMin;
}int main()
{
const int member = 4;
int player[member] = {0};
int turn[member] = {0};
int cnt = 0;
bool state = false;
while(cnt < 100000)
{
for(int i=0;i!=member;i++)
{
switch (i)
{
case 0:
{
if(player[i] > 3000)
break;
player[i]+=randNum(-1,400);
turn[i]++;
break;
}
case 1:
{
if(player[i] > 3000)
break;
player[i]+=randNum(-50,100);
turn[i]++;
break;
}
case 2:
{
if(player[i] > 3000 || player[i] < 2100000000)//21E
break;
player[i]+=randNum(-100,1);
turn[i]++;
break;
}
case 3:
{
if(!state)
cout << "P4你必然无法到达目标分数."<< endl;
else
break;
state = true;
break;
}
}
}
cnt++;
}
cout << endl;
cout << "运行游戏:" << cnt << "次" << endl;
for(int i=0;i!=member-1;i++)
{
cout << "第" << turn[i] <<"回,P"<< i+1
<< (player[i]>=3000?"达到目标点数3000点.":"还是无法达到目标点数3000点.") << endl;
}
return 0;
}
编译器:VS2012.
原理:生成随机数,从随机数分布概率着手设定达标速度与胜率.现在的胜率设置比较极端,请自行调整。
#include
#include
using namespace std;int randNum(int rangeMin,int rangeMax)
{
return static_cast
}int main()
{
const int member = 4;
int player[member] = {0};
int turn[member] = {0};
int cnt = 0;
bool state = false;
while(cnt < 100000)
{
for(int i=0;i!=member;i++)
{
switch (i)
{
case 0:
{
if(player[i] > 3000)
break;
player[i]+=randNum(-1,400);
turn[i]++;
break;
}
case 1:
{
if(player[i] > 3000)
break;
player[i]+=randNum(-50,100);
turn[i]++;
break;
}
case 2:
{
if(player[i] > 3000 || player[i] < 2100000000)//21E
break;
player[i]+=randNum(-100,1);
turn[i]++;
break;
}
case 3:
{
if(!state)
cout << "P4你必然无法到达目标分数."<< endl;
else
break;
state = true;
break;
}
}
}
cnt++;
}
cout << endl;
cout << "运行游戏:" << cnt << "次" << endl;
for(int i=0;i!=member-1;i++)
{
cout << "第" << turn[i] <<"回,P"<< i+1
<< (player[i]>=3000?"达到目标点数3000点.":"还是无法达到目标点数3000点.") << endl;
}
return 0;
}
全部回答
- 1楼网友:三千妖杀
- 2021-04-23 12:42
几乎所有的程序员都写过类似于“洗牌”的算法,也就是将一个数组随机打乱后输出,虽然很简单,但是深入研究起来,这个小小的算法也是大有讲究。我在面试程序员的时候,就会经常让他们当场写一个洗牌的函数,从中可以观察到他们对于这个问题的理解和写程序的基本功。
在深入讨论之前,必须先定义出一个基本概念:究竟洗牌算法的本质是什么?也就是说,什么样的洗牌结果是“正确”的?
云风曾经有一篇博文,专门讨论了这个问题,他也给出了一个比较确切的定义,在经过洗牌函数后,如果能够保证每一个数据出现在所有位置的概率是相等的,那么这种算法是符合要求的。在这个前提下,尽量降低时间复杂度和空间复杂度就能得到好的算法。
第一个洗牌算法:
随机抽出一张牌,检查这张牌是否被抽取过,如果已经被抽取过,则重新抽取,直到找到没被抽出过的牌,然后把这张牌放入洗好的队列中,重复该过程,直到所有的牌被抽出。
大概是比较符合大脑对于洗牌的直观思维,这个算法经常出现在我遇到的面试结果中,虽然它符合我们对于洗牌算法的基本要求,但这个算法并不好,首先它的复杂度为o(n2),而且需要额外的内存空间保存已经被抽出的牌的索引。所以当数据量比较大时,会极大降低效率。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯