【问题标题】:Generating an unique random number every time a C client runs每次 C 客户端运行时生成一个唯一的随机数
【发布时间】:2017-11-09 23:35:06
【问题描述】:

我正在尝试用 C 编写一个客户端/服务器应用程序,其中每个客户端向服务器发送一个特定值(一个随机生成的 1 到 50 之间的数字)。 但问题是每个客户端都向服务器发送相同的随机数。

这是客户端代码的一部分:

srand(time(NULL));
id=rand()%50 + 1; 

我确实理解,因为每次客户端运行时种子都设置为相同的值,这可能就是为什么也有相同的随机数的原因。

任何人都可以提出一个纠正这个问题的方法吗?

【问题讨论】:

  • 您是否在每个线程中都调用srand()?如果是这样,请不要在所有线程开始之前调用它一次。
  • 我正在尝试在客户端生成随机数。因此,每次执行新客户端时,srand 函数也会执行。 (我刚刚看到我的问题的前一个标题是错误的并对其进行了编辑。如果让您感到困惑,非常抱歉)
  • 每个客户都是他们自己的程序吗?每个程序应该只调用srand(),一旦它意味着看到你只播种一次的随机数生成器(通常在设置期间)。
  • 有一个客户端程序和一个服务器程序。所以为了说得到 4 个客户端,我使用 script.sh 文件执行客户端程序 4 次。每个客户端生成一个随机数并发送到服务器。然后服务器为每个客户端创建一个新线程并接受客户端发送的消息
  • 只要不是每个客户端在同一秒同时执行,每个客户端的种子都会不同。

标签: c random numbers client-server unique


【解决方案1】:

试试这个:

srand(clock());

time() 函数使用 精度。如果所有 4 个客户端在执行时几乎没有间隔完全并行(即所有客户端在 time() 返回的同一秒内有效运行),这可能不够精细。 clock() 函数提供了更好的时间分辨率。

值得注意的是,C — 与当今的大多数语言不同 ;) — 几乎没有启动开销(与运行时管理的语言等相比)。因此,每个程序在被您的 shell 脚本调用后几乎立即开始执行。

替代品。另一种解决方案是完全忘记使用时间/时钟作为种子。只需在脚本中为这 4 个实例中的每一个传递一个 唯一整数,作为命令行参数,然后使用它(作为种子或客户端 ID)。

【讨论】:

    【解决方案2】:

    例如,除了您已经使用的时间之外,您还可以将客户端的 id(用于标识每个客户端的东西)添加到种子中。这样,您应该获得唯一的随机种子,因此每个客户端也可以获得不同的随机数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-25
      • 1970-01-01
      • 2017-09-11
      • 2013-01-06
      相关资源
      最近更新 更多