我很惊讶为C代码编写一个java等效代码来生成随机数。 C代码如下: static void lng_cosem_CreateRandom(u8 * u8p_Array_p,u8 u8_Len_p) { u8 u8_Indx; u32 u32_Temp;
srand(GetTickCount());
#endif /* ABC_COMPILER_USED */
while( u8_Len_p )
{
u32_Temp = SYS_GetRandom32();
for( u8_Indx = 0; u8_Indx < 4; u8_Indx++ )
{
*u8p_Array_p++ = (u8)u32_Temp;
u32_Temp >>= 8;
u8_Len_p--;
if( !u8_Len_p )
{
break;
}
}
}
}
我在上面写了一个Java等效代码如下:
public static void CreateRandom(byte[] COSEM_CTOS, byte
COSEM_CHALLENGE_LEN)
{
long temp;
int index;
pos = 0;
while(COSEM_CHALLENGE_LEN!=0)
{
Random rand = new Random();
temp = Math.abs(rand.nextInt());
System.out.println(temp + "absolute val");
for(index=0;index<4;index++)
{
COSEM_CTOS[pos++] = (byte) temp;
temp >>= 8;
System.out.println(temp + "right shift value");
COSEM_CHALLENGE_LEN--;
if(COSEM_CHALLENGE_LEN == 0 )
{
break;
}
}
}
}
但在右移操作后我得到负数。我只想要正数。我该怎么做 ?
好的,现在我修改了代码。但是我得到负的随机数。请在下面建议修改代码
public static void CreateRandom(byte[] COSEM_CTOS, byte COSEM_CHALLENGE_LEN)
{
ByteBuffer b = ByteBuffer.allocate(4);
byte[] temp = b.array();
int index;
pos = 0;
while(COSEM_CHALLENGE_LEN!=0)
{
Random rand = new Random();
rand.nextBytes(temp);
for(index=0;index<4;index++)
{
COSEM_CTOS[pos++] = temp[index];
COSEM_CHALLENGE_LEN--;
if(COSEM_CHALLENGE_LEN == 0 )
{
break;
}
}
/* or we can use Math.abs(rand.nextByte(COSEM_CTOS)); */
}
}
enter code here
答案 0 :(得分:0)
我真的不明白,你想要完成什么。但是,无论是在C(++)还是在Java中,“生成随机自然(正数)数”的任务都在互联网上得到了很好的记录。
如果要将32位整数的四个部分存储为字节,必须有更优雅的方式来实现,而不是上面尝试的方式。 类似于here:
ByteBuffer b = ByteBuffer.allocate(4);
b.putInt(temp);
byte[] result = b.array();
(顺便说一句,在每次迭代中分配一个新的随机对象都是一个非常糟糕的主意)