package AlgorithmPractice;
import java.util.Arrays;
/*
* @Description:
* @Author: Rainbow
* @version:v1.0
* @date:2021年6月4日下午1:56:19
*
*
* 题目二:假设游戏一开始有100个人,每个人有100元钱,每轮每个人都要把自己的
* 一元钱等概率,随机的给别人,(不能是自己),如果没钱则,不需要给别人,
* 如果游戏发生了很多轮,请问钱分布大体平均还是极不平均?
*
* ***这个问题中,没有具体的明确的怎么算的公式,但是明确知道代码的尝试流程。
* 算法一般分为:1.明确知道怎么计算的
* 2.明确知道怎么尝试的流程 ,上面的分钱游戏就是属于第二种
*
*/
public class MoneyGame {
// 每人刚开始 有100 和随机给别人一元 、和玩多少轮 用函数实现,返回还是一个数组
public static int[] MethodF(int N,int turns,int InitMoney) {
int[] person = new int[N];// ? 100个人可以存在一个数组中,给每个人编号
for(int i=0;i<person.length;i++) {//每人分配100元钱
person[i]=InitMoney;
}
//等概率随机的的给一个人的记录。
int[] give=new int[N];
for(int t=0;t<turns;t++) {
for(int p=0;p<N;p++) {
give[p]=p;
if(person[p]>0) {
do { //查找出随机的人
give[p]=Random(N); //随机产生数赋给P
}while(give[p]==p);
}
}
for(int p=0;p<N;p++) {
if(give[p]!=p) { //每次
person[p]--; // 原来的人少
person[give[p]]++; // 被给的人增加
}
}
}
return person;
}
public static int Random(int N) {
return (int)(Math.random()*N); //产生0--n-1的等概率返回一个数。
}
public static void main(String[] args) {
int N=100;
int turns = 1000000;
int InitMoney = 100;
int[] person2 = MethodF(N, turns, InitMoney);
// 最后统计数组 排序 并打印 每人人有多少钱
Arrays.sort(person2);
int sum = 0;
double count1=0;
double count2=0;
double count3=0;
for (int i = 0; i < person2.length; i++) {
sum += person2[i];
System.out.println(person2[i] + " ");
if(person2[i]<100) {
count1++;
}
if(person2[i]<200 & person2[i]>100) {
count2++;
}
if(person2[i]>200) {
count3++;
}
}
System.out.println(" under 100: " + (double)(count1/(double)100));
System.out.println(" between 100-200: " + (double)(count2/(double)100));
System.out.println(" super 200: " + (double)(count3/(double)100));
System.out.println("all money: " + sum);
/*
* 世界的二八原则:
* under 100: 0.61 //穷人
* under 100-200: 0.23 //中产
* super 200: 0.14 //富人
* turns越大,穷人越多
* */
}
}
04-07
221
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)