如何在c/c++的无符号字符数组中生成n个随机的1
How to generate n random 1s in an unsigned char array in c/c++?
这是一个不同于我刚才问的问题,它更具挑战性。
我有一个unsigned char数组unsigned char A[16]。我需要生成一个遮罩向量,我将应用到我的数组a[16]。
应该包含n个'1',其中0
我还需要n个随机分布在向量中的1。
我如何在c/c++中做到这一点?
谢谢!
编辑:我的想法如下:我将生成n个随机数(需要进行检查以确保所有n个数字不相同)并将它们存储在数组tmp[n]中。然后基于移位生成掩码。
srand(time(0));
for(i = 0; i < n; i++){
for(j = 0; j < i; j++)
while(tmp[i] == tmp[j]) // to make sure all n random numbers are different
tmp[i] = rand()%128;
unsigned char mask[16]
for(i = 0; i < n; i++)
mask[16] |= (1 << tmp[i]); //generate mask
生成随机的(i,j)
对数字,其中i < 16
和j < 8
。如果B[i]&(1<<j)
位没有设置,则设置并增加"count"。循环直到"count"达到"n"。
一段代码(未经测试):
void generate_n_bit_mask ( unsigned char B[], int n )
{
// avoid infinite loop later on.
for ( int i=0; (i < 16); ++i ) {
B[i] = 0;
}
// invariant: k is number of currently masked bits.
for ( int k = 0; (k < n); )
{
// select bit at random.
int i = rand() % 16;
int j = rand() % 8;
unsigned char mask = 1 << j;
// set it if not selected previously.
if ( (B[i]&mask) == 0 ) {
B[i] |= mask, ++k;
}
}
}
练习,挑战:从代码中删除魔术常数16
。
Edit:您的评论中建议的修改包含一个严重的错误。下面是一个测试程序来测试比特在你的输出掩码中的分布方式。
#include <iostream>
#include <iomanip>
#include <ctime>
void generate_n_bit_mask ( unsigned char B[], int n )
{
// avoid infinite loop later on.
for ( int i=0; (i < 16); ++i ) {
B[i] = 0;
}
// invariant: k is number of currently masked bits.
for ( int k = 0; (k < n); )
{
// select bit at random.
int i = std::rand() % 16;
int j = std::rand() % 8;
unsigned char mask = 1 << j;
// set it if not selected previously.
if ( (B[i]&mask) == 0 ) {
B[i] |= mask, ++k;
}
}
int j = 0;
}
// count number of set bits in a byte.
int bit_count ( unsigned char x )
{
int n = 0;
for ( int i = 0; (i < 8); ++i ) {
n += ((x >> i) & 1);
}
return (n);
}
// count number of set bits in 16 bytes.
int total_bit_count ( unsigned char B[] )
{
int n = 0;
for ( int i = 0; (i < 16); ++i ) {
n += bit_count(B[i]);
}
return (n);
}
int main ( int, char ** )
{
std::srand(std::time(0));
unsigned char B[16];
// for all possible values of "n"
for ( int i = 0; (i <= 16*8); ++i )
{
// generate a 16 byte mask with "n" set bits.
generate_n_bit_mask(B, i);
// verify that "n" bits are set.
int n = total_bit_count(B);
if ( n != i ) {
std::cout << i << ": " << n << std::endl;
}
}
}
程序运行时,会尝试n
从0
到16*8
的每一个值,生成一个n
位的随机掩码,然后验证是否恰好设置了n
位。如果出现错误(对于某些n
的值,设置了某些k!=n
位),则输出一条消息。
如果我将条件更改为if ( (B[i]^mask) != 0 )
,我将在输出中得到一致的错误。每次运行至少产生一条错误消息。原始条件if ( (B[i]&mask) == 0 )
始终产生0个错误消息。
您有一个16个unsigned char
s的数组,可以看作是16 * 8位。为了生成n
为1位的随机掩码,需要在[0,16 *8]范围内生成一个随机位置,并将对应的位设置为1。如果该位先前为零,那么您刚刚向数组中添加了一位。重复此操作,直到添加了n
位。
相关文章:
- 在将数字随机生成为数组期间从内存输出随机数的数组
- 将随机生成的数字添加到数组 + 对这些数组求平均值
- C++具有随机计数的数组
- 从C++数组中选择一个随机元素
- 为什么我的 2d 数组的第二行从 RAM 中获取随机值?
- 该程序将.csv文件中的一系列单词放入数组中,然后随机生成句子.但它不起作用
- 为什么我的数组值会更新为随机值?
- 在 c++ 的 10x10 数组中生成特定数量的多个随机字符
- SFINAE - 检测类型 T 是指针、数组还是带有随机访问运算符的容器,以及给定的值类型
- 动态数组传递给 main 中用随机值填充的函数,返回值3221226356
- 选择随机字符串数组的排序
- 如何在 3x4 数组中随机 4 个不同的位置
- 字符数组中的十六进制导致写入套接字时出现随机字符
- 更快地访问 C++ 数组中的随机元素
- 在随机生成的数组中查找重复的连续数字
- 如何将 50 行和 50 列的二维数组编码为一个为元素随机分配星号的函数?
- 生成十六进制随机 16 字节数组
- 当 95% 情况下的值为 0 或 1 时,对非常大的数组进行随机访问的任何优化
- "Color Game" - 从数组 C++ 调用随机
- 如何使用数组制作随机分数生成器