2

在我的 android 应用程序中,我需要生成随机数,

我的应用程序将在 LAN 中的许多 android 设备上运行并使用随机数相互通信,我想生成这样一个随机且唯一的数字,在 LAN 中的任何应用程序中都不应该相同。

每次任何用户在他的设备和整个 LAN 中生成它时,它都应该是唯一的。

任何想法,我将不胜感激???

4

4 回答 4

2

鉴于问题评论中的说明,这就是我要做的:构建一个(确定性)方案,以 32 位整数交换位。想换多少就换多少。称其为“扰频器”。

然后只计算整数;对每一个都调用“扰码器”。

由于交换方案的确定性,唯一性得到保证,速度很快但在密码学上不安全。但请注意,通常这将具有较差的统计随机性属性,因此在需要均匀分布的随机数时(例如 Monte Carlo)永远不要使用它。但我认为它应该满足您的要求。

于 2013-09-08T20:02:03.613 回答
2

我对安卓不熟悉。但是,您的问题似乎可以通过 UUID 或通用唯一标识符来解决。一个快速的谷歌产生这个页面

特别是,您正在寻找根据 RFC 4122 生成变体 2、版本 4(随机生成的数字)UUID 的方法randomUUID()

于 2013-09-08T20:40:37.723 回答
1

这是生成随机数的方式:

Random r = new Random();
int random = r.nextInt(100); // returns a value between 0 (incl) and 100 (excl)

Random r = new Random();
int random = r.nextInt(100) + 20; // returns a value between 20 (incl) and 120 (excl)

关于数字应该是唯一的问题,您可能会以某种方式保存每个生成的数字。然后,当绘制一个新的随机数时,检查保存的数字是否已经生成了新的随机数。如果是这样,请重新绘制。

Java 随机文档:http ://docs.oracle.com/javase/6/docs/api/java/util/Random.html

于 2013-09-08T19:47:12.200 回答
1

我实际上发现你的要求是矛盾的。有效的随机序列不会生成唯一值,否则它不是随机的。我的意思是你根本不需要任何随机的东西,你只需要数字是唯一的。

为每个网络节点生成一个唯一编号非常容易将机器 ip 或 mac 地址与时间结合起来。要获得时间,只需System.currentTimeMillis();获取您的 IP 地址,然后使用此处的示例如何在 Java 中获取 mac 地址。结合这两个数字将为您带来独特性。

于 2013-09-08T20:24:28.603 回答