我有一个列表,我想从中随机选择一个节点.由于它不是一个阵列,我事先并不知道它的长度.有没有办法随机选择一个节点(均匀分布)而不必扫描整个列表(在最坏的情况下)两次(即获得其长度并在随机选择其位置后到达所选节点)?
这是我用于列表的代码:
struct mynode {
in_addr_t paddr;
struct mynode *prev, *next;
};
struct mylist {
struct mynode *first, *last;
char *name;
};
Run Code Online (Sandbox Code Playgroud) 我用过
#include<stdlib>
#include<time>
using namespace std;
srand((unsigned)time(0));
int n=(rand()>>8)%4;
Run Code Online (Sandbox Code Playgroud)
还有什么其他随机函数,或者其他函数可以用作随机数生成器?
编辑:我没有特别的理由提出这个问题,我只是想知道C++是否有任何其他随机函数.
它希望在密码学等安全应用中使用随机数生成器。
我知道它srand(time(NULL))可以用来在运行时生成随机数。
C 标准库中是否有更安全的安全随机数生成器实现?
嗨,我正在研究一个monty hall发生器,在我的代码的一部分,我需要它生成随机数2或3.它不能是1,2,3但计算机需要在2或3之间选择.谢谢!
我试过 randomCarDoor = ( rand() % 3 ) + 1;但不行.
randomCarDoor = ( rand() % 3 ) + 1;
它给了我数字,1,2,3但我只想要2和3
我需要C中的高质量随机数,但我不知道该怎么做.我需要能够从1-100获得数字.任何帮助或可能指向我可以找到帮助的地方.
英特尔C++编译器和/或GCC是否支持以下内在函数,例如自2012/2013年以来MSVC的内在函数?
int _rdrand16_step(uint16_t*);
int _rdrand32_step(uint32_t*);
int _rdrand64_step(uint64_t*);
int _rdseed16_step(uint16_t*);
int _rdseed32_step(uint32_t*);
int _rdseed64_step(uint64_t*);
Run Code Online (Sandbox Code Playgroud)
如果支持这些内在函数,那么它们支持哪个版本(请使用编译时常量)?
为什么以下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);的代码行没有引入模偏差.
我知道C标准库的伪随机数生成器不适合加密.当然,这不可能是一个因素,当然产生非常长,零和一系列的序列.可以吗?
这是来源:
在两台机器上编译使用: gcc -O3 -o 18TCT 18TrillionCoinTosses.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char* argv[])
{
srand(time(NULL));
int current_seq = 0;
int longest_seq = 0;
int prev_rand_num = -1;
long long i = 0;
long long total = 18000000000000;
// To …Run Code Online (Sandbox Code Playgroud) 有没有比以下更好的方式:
#define BOUND 7
int r;
int e = 1;
r = rand() % BOUND;
while (r == e){
r = rand() % BOUND;
}
Run Code Online (Sandbox Code Playgroud)
用于生成除值之外的范围内的数字e?
我想模拟随机提供52张标准卡而不使用rand/srand urandom等...
这是我的随机数函数
int rand2(int lim)
{
static int a = 34; // could be made the seed value
a = (a * 32719 + 3) % 32749;
return ((a % lim) + 1);
}
Run Code Online (Sandbox Code Playgroud)
结构我将知道卡是否已经弹出(0 =否,1是)
typedef struct s_game
{
int *cards;
int state;
unsigned int dat_rand;
} t_game;
int main()
{
t_game game;
int i;
int rd;
i = 0;
game.cards = malloc(sizeof(*game.cards) * 52);
while(i < 52)
{
rd = rand2(52);
if(game.cards[rd] == 0)
{
game.cards[rd] = …Run Code Online (Sandbox Code Playgroud) 我最近已经开始使用C,并且无法让计算机想到一个随机数.到目前为止这是代码.我需要帮助!
#include <stdio.h>
#include <stdlib.h>
int main ()
{
time_t t;
int userin;
printf("Guess a number from 1 to 10\n");
scanf("%d", userin);
int r = rand() % 11;
if (r == userin)
{
printf ("you are right");
}
else
{
printf("Try again");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
很多人解决了!!!!
所以我目前正在学习 C,我对该random()函数的工作方式有些困惑。我知道我必须提供一个种子,但我不知道如何实际生成随机数。
srandom(seed);
long int value= random(40);
Run Code Online (Sandbox Code Playgroud)
当我尝试这个时,它给了我一个编译器错误:
too many arguments to function ‘long int random()
Run Code Online (Sandbox Code Playgroud)
最终目标是获得 1 到 40 之间的随机数。我应该补充一点,目标是不使用该rand()函数。