来自一个菜鸟的求助!!!

海那边的小萌男 2017-07-13 06:02:57
求大神帮我实现一下,我自己弄了好久没弄成我想要的结果。
大意: 房间里面有100个人,每人有100块钱,每个人每分钟随机给另一个人1块钱。1小时候后结束
我想用Java代码实现整个过程,并且把每个人这一小时内钱的变化显示出来。
...全文
540 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
OKOKok
三仙半 2017-08-09
  • 打赏
  • 举报
回复
问题解决了?结贴呗?
  • 打赏
  • 举报
回复
我用2楼的算法测试的时候,发现每次 第二个人的金额都是最少的。 之后我改了一下。
三仙半 2017-07-17
  • 打赏
  • 举报
回复
我简单看了一下,2楼的方式也是可以实现的,不过有两点值得商榷。 1、两次交换之间的时间间隔似乎没有实现,另外,即使实现系统也是处于阻塞状态,不如用线程更合理。 2、产生交换对象的过程存在着碰撞的可能,这种算法不如根据赠与者的ID直接排除稳定。
三仙半 2017-07-14
  • 打赏
  • 举报
回复

import java.util.ArrayList;

/**
 * @author ZhengYesheng
 */
public class ExchangeHome implements Runnable
{
	public ExchangeHome()
	{
		userList = new ArrayList<User>();
		User user;
		for (int i = 0; i < USER_COUNT; i++)
		{
			user = new User(i);
			userList.add(user);
		}
	}

	//设置三个常量的目的是减小样本数,方便调试,正式版只需要将常量值修改为系统要求即可
	/**
	 * 系统运行总时间,单位:秒
	 */
	public static int TOTAL_TIME = 30;
	/**
	 * 每次交换的时间间隔,单位:秒
	 */
	public static int SPACE_TIME = 5;
	/**
	 * 系统中的总人数
	 */
	public static int USER_COUNT = 10;

	/**
	 * 当前时间,单位:秒
	 */
	private int curTime = 0;
	/**
	 * 系统中全部用户的列表
	 */
	private ArrayList<User> userList;

	public static void main(String[] args)
	{
		ExchangeHome home = new ExchangeHome();
		new Thread(home).run();
		System.out.println("----------  end  ---------");
	}

	@Override
	public void run()
	{
		while (curTime <=TOTAL_TIME)
		{
			try
			{
				User payer;
				User receiver;
				int receiverId;
				System.out.println("----------  " + curTime + "  ----------");
				for (int i = 0; i < USER_COUNT; i++)
				{
					payer = userList.get(i);
					//随机选取一个用户
					receiverId = (int) Math.floor(Math.random() * (userList.size() - 1));
					if (receiverId >= i)
					{
						//随机到当前用户或者之后的用户,将该ID加一,以保证不会给自己1元钱,并保证所有用户获得馈赠的概率相当
						receiverId += 1;
					}
					receiver = userList.get(receiverId);
					payer.give(receiver);
					System.out.println(payer.getId() + "(" + payer.getMoney() + ") --> " + receiver.getId() + "("
							+ receiver.getMoney() + ")");

				}
				Thread.sleep(SPACE_TIME * 1000);
				curTime += SPACE_TIME;
			}
			catch (InterruptedException e)
			{
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}

/**
 * @author ZhengYesheng
 *	用户类
 */
class User
{
	/**
	 * 用户的钱数
	 */
	private int money = 100;
	/**
	 * 用户ID
	 */
	private int id;

	public User(int id)
	{
		this.id = id;
	}

	/**
	 * 当前用户给目标用的一定数目的钱
	 * @param user
	 */
	public void give(User user)
	{
		// 这里应该考虑事务管理
		this.pay(1);
		user.receive(1);
	}

	/**
	 * 接收一定数目的钱
	 * @param v
	 */
	public void receive(int v)
	{
		money += v;
	}

	/**
	 * 支付一定数目的钱
	 * @param v
	 */
	public void pay(int v)
	{
		money -= v;
	}

	/**
	 * 获取用户当前持有的钱数
	 * @return
	 */
	public int getMoney()
	{
		return money;
	}

	/**
	 * 获取用户ID
	 * @return
	 */
	public int getId()
	{
		return id;
	}

}
  • 打赏
  • 举报
回复
引用 1楼三仙半 的回复:

import java.util.ArrayList;

/**
 * @author ZhengYesheng
 */
public class ExchangeHome implements Runnable
{
	public ExchangeHome()
	{
		userList = new ArrayList<User>();
		User user;
		for (int i = 0; i < USER_COUNT; i++)
		{
			user = new User(i);
			userList.add(user);
		}
	}

	//设置三个常量的目的是减小样本数,方便调试,正式版只需要将常量值修改为系统要求即可
	/**
	 * 系统运行总时间,单位:秒
	 */
	public static int TOTAL_TIME = 30;
	/**
	 * 每次交换的时间间隔,单位:秒
	 */
	public static int SPACE_TIME = 5;
	/**
	 * 系统中的总人数
	 */
	public static int USER_COUNT = 10;

	/**
	 * 当前时间,单位:秒
	 */
	private int curTime = 0;
	/**
	 * 系统中全部用户的列表
	 */
	private ArrayList<User> userList;

	public static void main(String[] args)
	{
		ExchangeHome home = new ExchangeHome();
		new Thread(home).run();
		System.out.println("----------  end  ---------");
	}

	@Override
	public void run()
	{
		while (curTime <=TOTAL_TIME)
		{
			try
			{
				User payer;
				User receiver;
				int receiverId;
				System.out.println("----------  " + curTime + "  ----------");
				for (int i = 0; i < USER_COUNT; i++)
				{
					payer = userList.get(i);
					//随机选取一个用户
					receiverId = (int) Math.floor(Math.random() * (userList.size() - 1));
					if (receiverId >= i)
					{
						//随机到当前用户或者之后的用户,将该ID加一,以保证不会给自己1元钱,并保证所有用户获得馈赠的概率相当
						receiverId += 1;
					}
					receiver = userList.get(receiverId);
					payer.give(receiver);
					System.out.println(payer.getId() + "(" + payer.getMoney() + ") --> " + receiver.getId() + "("
							+ receiver.getMoney() + ")");

				}
				Thread.sleep(SPACE_TIME * 1000);
				curTime += SPACE_TIME;
			}
			catch (InterruptedException e)
			{
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}

/**
 * @author ZhengYesheng
 *	用户类
 */
class User
{
	/**
	 * 用户的钱数
	 */
	private int money = 100;
	/**
	 * 用户ID
	 */
	private int id;

	public User(int id)
	{
		this.id = id;
	}

	/**
	 * 当前用户给目标用的一定数目的钱
	 * @param user
	 */
	public void give(User user)
	{
		// 这里应该考虑事务管理
		this.pay(1);
		user.receive(1);
	}

	/**
	 * 接收一定数目的钱
	 * @param v
	 */
	public void receive(int v)
	{
		money += v;
	}

	/**
	 * 支付一定数目的钱
	 * @param v
	 */
	public void pay(int v)
	{
		money -= v;
	}

	/**
	 * 获取用户当前持有的钱数
	 * @return
	 */
	public int getMoney()
	{
		return money;
	}

	/**
	 * 获取用户ID
	 * @return
	 */
	public int getId()
	{
		return id;
	}

}
谢谢。
  • 打赏
  • 举报
回复
感谢!! 感谢!! 我去试试, 哈哈哈
qq_39511161 2017-07-14
  • 打赏
  • 举报
回复
//我刚入门的,不懂楼上这么难的方法,,我写简单,试了下,也有你说的效果,,,不知道我写的可不可以...谢指教. import java.util.Random; public class test2 { public static void main(String[] args) { //如果要100个人,就把数组定义100的空间 int A[]=new int[10]; //每个人有100块 for(int i=0;i<10;i++) A[i]=100; //这里是6次,如果要看1小时就是60次 for(int j=0;j<6;j++) { //每次每个人都要先拿1块出来 for(int i=0;i<10;i++) { A[i]=A[i]-1; //随机给别人, ,用do...while 循环就是为了不要给自己 int k; do{ k=new Random().nextInt(10); //随机出一个从0到9的数 } while(i==k); A[k]=A[k]+1; } //用for打印出每个人的钱 for(int i=0;i<10;i++) System.out.print(A[i]+","); System.out.print("\n"); } } }

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧