Tag: 随机

rand()在多个函数调用中是一致的

当我尝试从函数调用中生成2个随机数时,我得到重复的结果。 但是, rand()函数在循环中工作正常,或者提供它们不在函数调用之外。 我猜这是因为系统时间和程序很小。 但我不知道如何改变种子。 #include #include #include int test1(){ int randX, randY; int range = 5; srand( time(NULL) ); randX = (rand() % range) + 1; randY = (rand() % 15 ) + 1; printf(“X:%d Y:%d\n”, randX, randY); } int main(){ test1(); test1(); test1(); test1(); test1(); }

生成没有随机函数的完全随机数?

可能重复: 真随机数发生器 前几天我和朋友聊天,我们试图弄清楚是否有可能在没有随机函数的帮助下生成完全随机的数字? 例如,在“C”中,“rand”生成伪随机数。 或者我们可以使用类似“srand(time(NULL));” 这将允许计算机从其时钟读取数字作为种子值。 因此,如果我理解到目前为止我所阅读的所有内容,那么我很确定没有随机函数实际产生真正的随机数。 如何编写一个程序来生成完全随机的数字以及代码看起来像什么?

18万亿投掷硬币,我哪里出错了?

为什么以下C代码在我的桌面和服务器上给出了不同的结果,两者都运行类似的Linux版本? 它在18万亿投币中发现行序列中最长的同一侧。 [见Iain M. Banks的科幻小说考虑Phlebas 。] 在服务器上,经过15.7万亿投币(它仍然在运行)之后,到目前为止,行序列中最长的同一侧只有29个。由于2^44 = 17,592,186,044,416 ,我希望最长的相同边序列在某个地方。 40到40年代中期,在完成所有18万亿之后可能达到44。 在仅仅47亿次投掷硬币之后的桌面上,最长的序列已经是31,因为2^31 = 2,147,483,648 ,这听起来是正确的。 那么为什么我在15.7万亿投币后只在服务器上获得了29个序列,但是在我的桌面上只有47亿的31个序列? Modulo偏见是我的第一个想法。 桌面和服务器上的RAND_MAX是相同的,2,147,483,647(32位签名长)。 所以rand()函数会给我一个数字0 <= rand() <= 2,147,483,647 。 0是偶数,2,147,483,647是奇数,所以除非我非常误以为我的int rand_num = (rand() % 2);引入了模数偏差int rand_num = (rand() % 2); 代码行。 我知道C标准库的伪随机数生成器不适合加密。 当然,这不是一个因素,当然,实际上相当长,零和一系列的序列。 可以吗? 这是来源: 使用以下两种机器编译: gcc -O3 -o 18TCT 18TrillionCoinTosses.c #include #include #include int main(int argc, char* argv[]) { […]

在C中设置间隔生成随机数

我知道python,在设定的时间间隔内创建一个随机数是如此简单,但是在C中它似乎有点复杂。 通过查看有关堆栈溢出的其他问题,这就是我所拥有的。 int diceroll_1; diceroll_1=(rand()%3)+1; printf(“%d\n”,diceroll_1); 问题是它每次给我3个。 我希望每次编译和运行程序时它都不同。 我希望它从1到3随机。 我的理解是,这可能会保存它,这就是为什么它每次产生3而不是我想要的。 如何每次生成一个随机数而不是相同的数字?

用于C语言加密的快速伪随机数发生器

我使用以下代码生成用于加密目的的伪随机数序列,但后来我在某处读到它可能不是很安全。 有人可以给我一个更好的生成器的C实现 – 主要目标是这个方法快速。 例如,我做了一些研究并遇到了Blum Blum Shub方法,它会通过执行pow(N)计算完全扼杀性能。 PS。 请不要引用没有C / C ++代码的维基百科文章。 我正在寻找我在下面展示的C或C ++代码示例。 #define ROL(v, shift) ((((v) >> ((sizeof(v) * 8) – (shift))) | ((v) << (shift)))) ULONGLONG uiPSN = doSeed(); //64-bit unsigned integer for(int i = 0; i < sizeOfArray; i++) { uiPSN = uiPSN * 214013L + 2531011L; uiPSN = ROL(uiPSN, 16); […]

在C中有效地从文本文件中有效地选择随机行?

这本质上是这个问题的一个受限制的版本。 假设我们有一个非常大的文本文件,包含大量的行。 我们需要从文件中随机选择一条线,具有统一的概率,但是存在约束条件: 因为这是一个软实时应用程序,所以我们无法迭代整个文件。 选择应该花费不变的时间。 由于内存限制,无法缓存文件。 由于允许在运行时更改文件,因此不能将文件的长度假定为常量。 我的第一个想法是使用lstat()调用以字节为单位获取总文件大小。 然后可以使用fseek()直接访问随机字节偏移量,将类似O(1)的内容访问到文件的随机部分。 问题是我们不能再做一些事情,比如读到下一个换行符并将其称为一天,因为这会产生偏向长线的分布。 我解决这个问题的第一个想法是读取直到第一个“n”换行符(如果需要,回绕到文件的开头),然后从这个较小的集合中选择一个具有统一概率的行。 可以安全地假设文件的内容是随机排序的,因此这个子样本在长度方面应该是统一的,并且,由于它的起始点是从所有可能的点统一选择的,所以它应该代表从文件中统一选择的整个。 所以,在伪C中 ,我们的算法看起来像: lstat(filepath, &filestat); fseek(file, (int)(filestat.off_t*drand48()), SEEK_SET); char sample[n][BUFSIZ]; for(int i=0;i<n;i++) fgets(sample[i], BUFSIZ, file); //plus some stuff to deal with file wrap around… return sample[(int)(n*drand48())]; 这似乎不是一个特别优雅的解决方案,我并不完全相信它会是统一的,所以我想知道是否有更好的方法来做到这一点。 有什么想法吗? 编辑:进一步考虑,我现在很确定我的方法不统一,因为起点更可能在更长的单词内,因此不均匀。 整蛊!

这个改组算法有什么问题吗?

我一直在做一些休闲度假计算。 我的迷你项目是对意大利“tomboli”游戏的模拟。 一个关键的构建模块是对以下过程的模拟; 游戏由一个男人控制,一袋有90个大理石,编号为1到90.他从包中随机抽出弹珠,每次都给玩家打出大理石编号。 经过一番思考后,我为这个构建块编写了以下代码; // NBR marbles, numbered 1…NBR are in a bag. Simulate randomly // pulling them from the bag, one by one, until the bag is empty void bag( int random_sequence[NBR] ) { int i; // Store each marble as it is pulled out int *store = random_sequence; // Array of marbles […]

C中的随机数发生器

我正在尝试生成0到59的随机数,并且对C中的rand()函数不满意。这是我正在使用的代码: #include #include main() { int num; srand(time(NULL)); num = rand(); num = num % 59; printf(“%d\n”, num); } 我已经重复了这段代码的运行,并注意到生成的随机数似乎并不是随机的。 生成的数字肯定是遵循一种模式,因为每次运行程序时,数字会逐渐变大,直到它回绕到开头(即2,17,21,29,38,47,54,59,4, 11 ….等)。 有没有一种方法可以使函数播种,这样每次重新运行函数时,我得到一个真正的随机数,生成的概率为1/60? 或者是否有任何替代方法我可以自己实现而不是在C中使用rand()函数?

如何使用C / C ++预处理器生成一系列随机数

我想用C预处理器生成一系列随机数,并将它们存储在变量中供我的程序使用。 目的: 我想在每次构建程序时生成一组“唯一”的随机数。 存储随机数的一小部分变量将被有意义的(即非随机的)数字覆盖。 我希望黑客不可能通过调试程序或比较多个构建来区分有意义的数字和随机数。 我希望构建过程自动化并且自包含。 我希望实现可以跨Visual Studio和GCC移植。 澄清: 计算必须在编译时完成,而不是在程序执行时完成。 调试程序的任何人都应该只能看到,例如,一个变量被初始化为一个常量(随机数)。 随机数应该是整数。 随机数生成器应以某种方式从__DATE__和__TIME__ __DATE__ ,这样不同的构建将产生不同的随机数。 能够指定随机数的范围(例如从1到100)将是优选的,但不是绝对必要的。 能够指定要生成的随机数的总数(例如,声明1000个变量并将每个变量初始化为随机数)将是优选的,但不是绝对必要的。 到此为止: 预处理器中的先前运算线程: C预处理器可以执行整数运算吗? 外卖是#if条件可以评估算术。 谷歌搜索显示除了算术,移位和位操作也可以由#if评估。 我已经使用Visual Studio C ++确认了这一点。 简单随机数发生器的候选人: http : //www.ciphersbyritter.com/NEWS4/RANDC.HTM#369B5E30.65A55FD1@stat.fsu.edu这些发生器中的任何一个,或任何不能从给定的逆向工程的发电机一系列随机数,没问题,因为我不需要特别好的发电机。 为了本练习,我们可以使用以下示例: unsigned long jcong=380116160; #define CONG (jcong=69069*jcong+1234567) 我认为基本问题是在连续调用生成器之间存在存储在变量jcong中的状态。 据我所知,预处理器不支持变量赋值。 也许有一些聪明的递归宏可以做到这一点? 我能得到的最接近但不满足预处理器执行的目标是: unsigned long jcong=380116160; unsigned long randomBlock[] = {jcong=69069*jcong+1234567, jcong=69069*jcong+1234567}; 我已经在Visual Studio C ++中确认这确实将数组成员初始化为不同的随机数。 但是,调试器仍然会逐步完成初始化。 […]

使用getrandom在C中随机浮动

我试图在0和1之间生成一个随机浮点数(无论是[0,1]还是[0,1])对我来说都不重要。 关于这个的每个问题似乎涉及rand()调用,播种time(NULL) ,但我希望能够每秒多次调用我的程序并且每次都得到不同的随机数。 这引导我进入Linux中的getrandom系统调用,它来自/ dev / urandom。 我想出了这个: #include #include #include #include int main() { uint32_t r = 0; for (int i = 0; i < 20; i++) { syscall(SYS_getrandom, &r, sizeof(uint32_t), 0); printf("%f\n", ((double)r)/UINT32_MAX); } return 0; } 我的问题是我是否正确地这样做。 它似乎有效,但我担心我会误用某些东西,并且接下来没有使用getrandom()在线的例子。