【问题标题】:Random number generation always returns same value随机数生成总是返回相同的值
【发布时间】:2015-07-16 01:20:21
【问题描述】:

我正在尝试运行一个简单的程序,其中服务器侦听连接、接收客户端请求并发送消息。也许微不足道,但我的困惑是关于服务器的行为。代码如下:

服务器代码:

import java.net.*;
import java.io.*;
import java.util.*;

public class haikuServer {

    private static String chooseHaiku() {
        String[] haiku = new String[3];
        haiku[0] = "Pawprints disappear"+"\n"+"into the snowy glen, but"+"\n"+"fox waits patiently.";
        haiku[1] = "Whispering winds cry"+"\n"+"while frenzied snowflakes scatter,"+"\n"+"searching for others.";
        haiku[2] = "The path, hard and long"+"\n"+"brings dawn with passage of time"+"\n"+"and then my heart sings.";

        Random t = new Random();
        int ch = t.nextInt(3); 
        return haiku[ch];
    }

    public static void main(String[] args) {
        try {
            ServerSocket sock = new ServerSocket(5575);

            while (true) {
                Socket client = sock.accept();

                PrintWriter pout = new PrintWriter(client.getOutputStream(), true);

                String haiku = chooseHaiku();
                pout.println(haiku);
                client.close();
            }
        } catch (Exception e) {}
    }
}

客户端代码:

import java.net.*;
import java.io.*;

public class haikuClient {
    public static void main(String[] args) {
        try {
            Socket sock = new Socket("127.0.0.1", 5575);

            InputStream in = sock.getInputStream();
            BufferedReader bin = new BufferedReader(new InputStreamReader(in));

            System.out.println("\nHaiku:\n");
            String line;
            while ((line = bin.readLine()) != null) {
                System.out.println(line);
            }
            System.out.println();

            /* Close the socket connection */
            sock.close();

        } catch (IOException ioe) {
            System.err.println(ioe);
        }
    }
}

代码运行良好。我编译这两个文件。要运行它们,我使用:java haikuServer &(& 在后台运行程序),然后是 haikuClient。我的问题是我尝试多次运行 haikuClient 但始终,服务器选择的是第一个,即 haiku[0] 而不是其他的。为什么会这样?

【问题讨论】:

  • 永远不要默默吞下异常catch (Exception e) {}
  • 所以你的问题与套接字无关,而是为什么随机不按你的预期工作 - 对。
  • 正如我在下面的答案中也提到的,也许我又犯了一些错误,但我尝试运行客户端超过 10 次,仍然只得到第一个。
  • 保持你的问题简短。如果您包含太多不相关的内容,其他人不会花时间回答您。
  • 还有,俳句很无聊:)

标签: java sockets client server port


【解决方案1】:

与网络无关,与随机数生成有关。

您观察到仅返回数组中的第一项是不正确的...当我运行您的代码时,它会在数组中的前两个元素之间交替。

nextInt 的文档说明了这一点:

返回一个伪随机、均匀分布的 int 值,介于 0 之间 (含)和指定值(不含)

所以这个调用:nextInt(2) 返回一个介于 0 和 1 之间的数字。如果您运行客户端足够多次,您将看到 Haiku 在数组中的第一个和第二个之间交替返回。要获取您想要使用的三个随机元素中的任何一个,请使用nextInt(3)。

【讨论】:

  • 因为不使用 nextInt(3),我的错。我可能又在某个地方出错了,但我仍然只得到第一个数组元素作为响应 - 我尝试了 10 多次但仍然相同,事实上,这就是为什么我甚至提到了我编译和运行程序的方式。
  • 是的,这个问题与网络无关。但我还是选择了这样的标题和标签,因为我认为有知识的人只会喜欢这个。但同样,我是所有这一切的新手,所以也许我过度假设了。
  • @Neha 这不是我看到的结果 - 如果我让服务器进程运行并多次运行客户端,我首先会得到两者的混合。您确定您运行的是正确版本的代码吗?
  • 是的,当然。你第一次指出,我仔细检查了。事实上,当我第一次看到这个问题时,我只是写了一个代码来检查随机数生成器是否工作正常。它做了。因此,我认为我可能会在其他地方遗漏一些东西。但是,如果你说你做对了,我最好亲自把它展示给某人并做对。无论如何,非常感谢您的帮助! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多