public class RandomUtil {
private static Random random = new Random();
public static String getRandomNumber(String[] range,int rangeLength,int length){
StringBuffer sb = new StringBuffer();
for(int i=0;i<length;i++){
sb.append(String.valueOf(range[random.nextInt(rangeLength)]));
}
return sb.toString();
}
public static void main(String[] args) {
String[] range = {"0","1","2","3","4","5","6","7","8","9"};
System.out.println(getRandomNumber(range, 10, 8));
}
}
运行结果:
91373770
以上是最简单的随机数产生,不排除产生相同随机数的可能性。如果投入使用,需要加上一个过滤器,将重复数据进行过滤,真实应用中,你会发现8位数据产生到50多W的时候就会经常性发生重复数据。
二. 那么如何产生唯一的随机数呢,参考如下代码:
public class GUIDUtil
{
/* 随机种子 */
private static char x36s[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
/* 随机数长度 */
private static short len = 20;
public static String newId()
{
char chs[] = new char[len];
/**
* 生成前8位随机字符(以系统时间为随机池, 以36位数字+英文字母为随机种子)
*/
System.out.println(System.currentTimeMillis()-936748800000L);
long v = (System.currentTimeMillis()-936748800000L)>>1; //1999-9-9 开始,起码要横跨102年:)
for(int i=7; i>0; i--)
{
chs[i] = x36s[(int)(v%36)];
v = v/36;
}
chs[0] = x36s[(int)(v%26) + 10]; //确保第一个随机字符是"字母", 以符合一般编程的标识符定义
/**
* 生成后12位随机字符(以UUID为随机池, 以36位数字+英文字母为随机种子)
*/
UUID u = UUID.randomUUID();
v = u.getLeastSignificantBits()^u.getMostSignificantBits();
System.out.println(v);
if(v < 0)
{
v = -v;
}
for(int i=8; i<len; i++)
{
chs[i] = x36s[(int)(v%36)];
v = v/36;
}
return new String(chs);
}
}
如上部分采用了比较通用的UUID标准产生算法。在产生时尽量通过jvm的与或和移位操作,保证了JVM的高效执行,这些操作在新的JVM里面是可以直接运算的,不需要其它步骤。甚至hashCode计算时使用的*31在新的JVM里面也可以转换成移位操作的。(这是题外话)
通过时间戳+UUID最高位和最低位异或的方式获得,能保证近似唯一ID的获得。
三.如上的方法真的能保证唯一ID吗?
答案是否定的,影响ID产生的无非是MAC地址+时间戳+随机数 。在分布式应用中,同一台机器也可能在同一时间被不同的应用访问,数据量很大时,很有可能产生相同的ID,并且使用JAVA的guid效率并不高。这里可以通过用一台server机器来预先生成唯一ID,这个是批量生成的。然后供应用去取。
如下:
- 大小: 44.8 KB
分享到:
相关推荐
本课程作业聚焦于30种不同的随机数发生器,其中包括5种基础的随机数发生器及其两两组合形成的25种组合随机数发生器。所有这些实现均采用MATLAB编程语言,这是一款广泛应用于科学计算的软件。 首先,我们来探讨...
在Keil C51开发环境中,生成随机数是嵌入式系统编程中常见的需求,尤其在游戏、加密算法、测试...为了提高随机性的质量,可以考虑使用硬件时钟等物理量作为种子来源,从而避免每次程序运行时都产生相同的随机数序列。
对于生成随机序列号,可能需要包含字母和数字的组合,这可以通过扩展`Random`类或者使用`Guid`类来实现。例如,创建一个包含数字和字母的10位随机字符串: ```csharp public static string GenerateRandomString...
综上所述,在C语言编程中,虽然不能生成真正的随机数,但可以利用rand()和srand()函数的组合产生满足各种需求的伪随机数。为了提高随机数序列的不可预测性,应当使用基于当前时间的种子值。此外,编写通用的随机数...
默认情况下,Excel提供的RAND()函数会生成0到1之间的随机浮点数,每次打开工作簿时,这个函数都会重新计算,产生新的随机数。然而,这并不符合某些场景下对稳定随机数的需求。这时,我们可以借助VBA(Visual Basic ...
总之,C#提供的`Random`类是生成随机数的核心工具,结合数组、集合等数据结构,我们可以灵活地生成各种随机数组合,以满足各种应用场景,如本例中的试卷随机排序。这种能力在开发游戏中创建随机事件、模拟实验、测试...
首先,程序会利用内置或自定义的随机数生成器来产生一系列随机整数。这些整数通常介于0和某种限制之间,例如0到62(对应26个小写字母、26个大写字母和10个数字)。然后,每个随机数会被映射到相应的字母或数字上,...
这些生成器能够产生看似随机但实际上可预测的数字序列,对于测试假设、构建模型以及进行各种统计计算至关重要。MATLAB是一种广泛用于数学计算和数据分析的高级编程环境,其内置了多种随机数生成器。这份"计算统计学...
通常,MATLAB的标准库并不直接提供拉普拉斯分布的随机数生成,但可以通过组合其他函数实现,如`randn`(产生标准正态分布的随机数)和`exp`(指数函数)。 下面是一个可能的`laprnd.m` 函数实现: ```matlab ...
为了验证随机数生成器产生的随机序列的质量,NIST还规定了一系列测试方法。这些测试包括但不限于: - **频率测试**:评估随机比特序列中0和1的出现频率是否接近相等。 - **串长测试**:检查随机序列中连续相同数字...
描述中的"产生随机数的一段c代码"可能涵盖了自定义随机数生成器的实现,或者对标准库函数的扩展。从提供的文件名来看,这些文件可能是不同类型的随机数生成算法的实现: 1. **sfmt.cpp** 和 **sfmt.h**:SFMT(SIMD...
在C语言中,`rand()` 函数用于生成伪随机数序列,而 `srand()` 函数则用于设置随机数生成器的种子值。这两个函数通常结合使用来生成一系列的随机数。 - **`rand()`**: 此函数返回一个介于0到`RAND_MAX`之间的整数。...
在这个MFC示例中,`CRandom`类的`Randomize`方法用于初始化随机数生成器,`Range`方法则用于生成指定范围内的随机整数。 如果你需要在程序中多次生成随机数,通常会把随机数引擎的实例作为全局变量或成员变量来保存...
2. **随机数的唯一性**:在一个周期内,混合同余法产生的随机序列中的任意两个随机数不可能完全相同,这一点在某些应用场景下可能不符合实际情况。 3. **最大周期条件**:Hull和Dobell证明了混合同余法能够实现最大...
例如,可以将多个`rand()`的结果组合起来,或者使用其他随机数生成器如Mersenne Twister。 接口的设计是为了提供一种简洁的调用方式,让其他部分的代码可以方便地使用随机数生成功能,而不必关心具体的实现细节。在...
在计算机中,由于硬件限制,真正的随机数是无法生成的,因此通常使用伪随机数生成器(Pseudo-Random Number Generator, PRNG)。这些生成器根据一个初始值(称为种子)生成一系列看似随机的数字序列,但其实这个序列...
真随机数依赖于物理过程生成,而伪随机数则是通过数学运算产生的一系列数值,这些数值看起来是随机的,但实际上是由一个确定性的算法产生的。 在本示例中,使用的是C++语言中的伪随机数生成方法。 ### 2. C++中的...
"randm_randm_Verilog产生伪随机数模块"就是一个这样的设计实例,它旨在创建一个8位的伪随机数发生器。 伪随机数生成器(PRNG)并不像真正的随机数那样具有完全不可预测性,而是通过数学算法生成一系列看起来随机但...