Random函数的一点小问题

先知先觉 2014-07-13 10:16:14



每次一按 ↓ 除了第一次是是产生一个随机数,第二次开始每次就不止产生一个随机数了... 第二张图是按了3次↓, 总共产生了11个随机数....,求解这是什么问题? 谢谢

...全文
188 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
highnewrain 2014-07-13
  • 打赏
  • 举报
回复
你这里是执行了11次run()方法,跟random()方法没有什么关系吧! 你的思路是每按一次向下键,就调用一次ran()方法吧,所以你看看是不是在其它地方也调用ran()方法了,或者你按键监听事件监听的有问题
highnewrain 2014-07-13
  • 打赏
  • 举报
回复
引用 7 楼 u010005508 的回复:
[quote=引用 6 楼 u011368016 的回复:] [quote=引用 5 楼 u010005508 的回复:] 找到问题了:你在VK_DOWN那处理代码那,会调用下面这个initialize()方法,你每调用一次他就会给jf添加一个新的按键事件监听器,所以你按一次,jf的按键监听器就会加倍,所以到时会有多个监听器来处理你VK_DOWN事件,导致run()多次调用 你可以将
jf.addKeyListener(new operate());
放到map的构造函数中去,将 initialize()中的注释掉就好啦
void initialize()
	{
		jp.setLayout(new GridLayout(4, 4));
		//jf.addKeyListener(new operate());   //每次都会添加一个新的事件处理程序。。。
		jf.add(jp);
		jf.setVisible(true);
		jf.setBounds(300, 100, 400, 400);
	}
提醒一下你:为啥你switch中的每个case后面都加一个空语句
;
谢谢姐姐的解答及提醒 ,已改正[/quote] 我不是妹子! [/quote] 哦,忘了说了,照你现在的代码initialize()方法只需在Map类的构造函数中调用一次就可以了,不用注释和移动jf.addKeyListener(new operate());这句代码了,直接把其它地方的initialize()注释掉也可以
先知先觉 2014-07-13
  • 打赏
  • 举报
回复
引用 7 楼 u010005508 的回复:
[quote=引用 6 楼 u011368016 的回复:] [quote=引用 5 楼 u010005508 的回复:] 找到问题了:你在VK_DOWN那处理代码那,会调用下面这个initialize()方法,你每调用一次他就会给jf添加一个新的按键事件监听器,所以你按一次,jf的按键监听器就会加倍,所以到时会有多个监听器来处理你VK_DOWN事件,导致run()多次调用 你可以将
jf.addKeyListener(new operate());
放到map的构造函数中去,将 initialize()中的注释掉就好啦
void initialize()
	{
		jp.setLayout(new GridLayout(4, 4));
		//jf.addKeyListener(new operate());   //每次都会添加一个新的事件处理程序。。。
		jf.add(jp);
		jf.setVisible(true);
		jf.setBounds(300, 100, 400, 400);
	}
提醒一下你:为啥你switch中的每个case后面都加一个空语句
;
谢谢姐姐的解答及提醒 ,已改正[/quote] 我不是妹子! [/quote] 不管啦~~~~ 哈哈 还是谢谢~~~~~ ~
highnewrain 2014-07-13
  • 打赏
  • 举报
回复
引用 6 楼 u011368016 的回复:
[quote=引用 5 楼 u010005508 的回复:] 找到问题了:你在VK_DOWN那处理代码那,会调用下面这个initialize()方法,你每调用一次他就会给jf添加一个新的按键事件监听器,所以你按一次,jf的按键监听器就会加倍,所以到时会有多个监听器来处理你VK_DOWN事件,导致run()多次调用 你可以将
jf.addKeyListener(new operate());
放到map的构造函数中去,将 initialize()中的注释掉就好啦
void initialize()
	{
		jp.setLayout(new GridLayout(4, 4));
		//jf.addKeyListener(new operate());   //每次都会添加一个新的事件处理程序。。。
		jf.add(jp);
		jf.setVisible(true);
		jf.setBounds(300, 100, 400, 400);
	}
提醒一下你:为啥你switch中的每个case后面都加一个空语句
;
谢谢姐姐的解答及提醒 ,已改正[/quote] 我不是妹子!
先知先觉 2014-07-13
  • 打赏
  • 举报
回复
引用 5 楼 u010005508 的回复:
找到问题了:你在VK_DOWN那处理代码那,会调用下面这个initialize()方法,你每调用一次他就会给jf添加一个新的按键事件监听器,所以你按一次,jf的按键监听器就会加倍,所以到时会有多个监听器来处理你VK_DOWN事件,导致run()多次调用 你可以将
jf.addKeyListener(new operate());
放到map的构造函数中去,将 initialize()中的注释掉就好啦
void initialize()
	{
		jp.setLayout(new GridLayout(4, 4));
		//jf.addKeyListener(new operate());   //每次都会添加一个新的事件处理程序。。。
		jf.add(jp);
		jf.setVisible(true);
		jf.setBounds(300, 100, 400, 400);
	}
提醒一下你:为啥你switch中的每个case后面都加一个空语句
;
谢谢姐姐的解答及提醒 ,已改正
highnewrain 2014-07-13
  • 打赏
  • 举报
回复
找到问题了:你在VK_DOWN那处理代码那,会调用下面这个initialize()方法,你每调用一次他就会给jf添加一个新的按键事件监听器,所以你按一次,jf的按键监听器就会加倍,所以到时会有多个监听器来处理你VK_DOWN事件,导致run()多次调用 你可以将
jf.addKeyListener(new operate());
放到map的构造函数中去,将 initialize()中的注释掉就好啦
void initialize()
	{
		jp.setLayout(new GridLayout(4, 4));
		//jf.addKeyListener(new operate());   //每次都会添加一个新的事件处理程序。。。
		jf.add(jp);
		jf.setVisible(true);
		jf.setBounds(300, 100, 400, 400);
	}
提醒一下你:为啥你switch中的每个case后面都加一个空语句
;
先知先觉 2014-07-13
  • 打赏
  • 举报
回复
引用 3 楼 u010005508 的回复:
[quote=引用 2 楼 u011368016 的回复:] [quote=引用 1 楼 u010005508 的回复:] 你这里是执行了11次run()方法,跟random()方法没有什么关系吧! 你的思路是每按一次向下键,就调用一次ran()方法吧,所以你看看是不是在其它地方也调用ran()方法了,或者你按键监听事件监听的有问题
就能够地方调用了。。。 多余地方的全删了... 每次产生的随机数都是大于一个,跟想象的完全不一样...[/quote] 代码全贴出来帮你看看?[/quote] class Map { int [][] beijing = {{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}; Icon [][] icons = new Icon [4][4]; JFrame jf = new JFrame(); JPanel jp = new JPanel(); int a,b; public Map() { ran(); chushihua(); initialize(); } void chushihua() { for (int i=0;i<4;i++) { for (int j=0;j<4;j++) { if (beijing[i][j]==2) { icons[i][j]=new ImageIcon("D:\\我的文档\\Java Project\\Go\\src\\image\\2.jpg"); } if (beijing[i][j]==4) { icons[i][j]=new ImageIcon("D:\\我的文档\\Java Project\\Go\\src\\image\\4.jpg"); } if (beijing[i][j]==8) { icons[i][j]=new ImageIcon("D:\\我的文档\\Java Project\\Go\\src\\image\\8.jpg"); } if (beijing[i][j]==16) { icons[i][j]=new ImageIcon("D:\\我的文档\\Java Project\\Go\\src\\image\\16.jpg"); } if(beijing[i][j]==0) { icons[i][j]=new ImageIcon("D:\\我的文档\\Java Project\\Go\\src\\image\\0.jpg"); } jp.add(new JLabel(icons[i][j])); } } } void ran() { a=(int) ((Math.random()*100)%3); b=(int) ((Math.random()*100)%3); // while ( beijing[a][b]==2) // { // a=(int) ((Math.random()*100)%3); // b=(int) ((Math.random()*100)%3); // } beijing[a][b]=2; System.out.print(".a"+a + b); } void initialize() { jp.setLayout(new GridLayout(4,4)); jf.addKeyListener(new operate()); jf.add(jp); jf.setVisible(true); jf.setBounds(300, 100, 400, 400); } class operate implements KeyListener { public void keyPressed(KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_LEFT : //左 { for (int a=0;a<4;a++) { for (int b=0;b<4;b++) { if (beijing[a][b]==2&&b!=0) { beijing[a][b]=0; beijing[a][0]=2; } } } jp.removeAll(); chushihua(); initialize(); }; break; case KeyEvent.VK_DOWN://下 { jp.removeAll(); ran(); chushihua(); initialize(); }; break; case KeyEvent.VK_RIGHT://右 { }; break; case KeyEvent.VK_UP://上 { }; break; default:; break; } } public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { } } } public class jiemian { public static void main(String[] args) { new Map(); } } 不是很规范... 见笑了
highnewrain 2014-07-13
  • 打赏
  • 举报
回复
引用 2 楼 u011368016 的回复:
[quote=引用 1 楼 u010005508 的回复:] 你这里是执行了11次run()方法,跟random()方法没有什么关系吧! 你的思路是每按一次向下键,就调用一次ran()方法吧,所以你看看是不是在其它地方也调用ran()方法了,或者你按键监听事件监听的有问题
就能够地方调用了。。。 多余地方的全删了... 每次产生的随机数都是大于一个,跟想象的完全不一样...[/quote] 代码全贴出来帮你看看?
先知先觉 2014-07-13
  • 打赏
  • 举报
回复
引用 1 楼 u010005508 的回复:
你这里是执行了11次run()方法,跟random()方法没有什么关系吧! 你的思路是每按一次向下键,就调用一次ran()方法吧,所以你看看是不是在其它地方也调用ran()方法了,或者你按键监听事件监听的有问题
就能够地方调用了。。。 多余地方的全删了... 每次产生的随机数都是大于一个,跟想象的完全不一样...

62,616

社区成员

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

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