C++ 一种简单的算法,它接受两个整数并返回一个随机整数
函数应该是这样的C++ 一种简单的算法,它接受两个整数并返回一个随机整数,c++,c,random,C++,C,Random,函数应该是这样的 int generateSortOfRandomInt(int X, int Y){ /* Your program */ return randomINT that is always the same for X and Y } 如果 generateSortOfRandomInt5,15!=第15,5代 例如 int value1 = generateSortOfRandomInt(1, 3); // 546547 int value2 = generateSo
int generateSortOfRandomInt(int X, int Y){
/*
Your program
*/
return randomINT that is always the same for X and Y
}
如果
generateSortOfRandomInt5,15!=第15,5代
例如
int value1 = generateSortOfRandomInt(1, 3); // 546547
int value2 = generateSortOfRandomInt(3, 1); // 134566
int value3 = generateSortOfRandomInt(1, 3); // 546547 THE SAME AS value1
int value4 = generateSortOfRandomInt(2, 3); // 646621
谢谢以下是我的想法:
int generateSortOfRandomInt(int X, int Y)
{
srand(x*x+y);
return rand();
}
你的问题很模糊。有一百万种不同的方法可以做到这一点 有些想法是: 将数字除以,然后移动小数点以创建一个数字 然而,根据你是如何得到不同的结果,根据作为参数给出的数字的顺序。我将使用这些数字根据参数向左或向右移动位
搜索柏林噪波以查找2D。如果我没记错的话,这将为相同的输入提供相同的输出
return std::hash<int>()(std::hash<int>()(x) + y);
在C++中没有RAND方法吗?使用或RAND非交换操作?或者可以使用哈希函数。这个问题的动机是什么?你想解决什么问题?这似乎是你强加的一套任意规则,想必你有一个很好的理由不想使用标准库附带的随机化函数,所以你需要向我们提供关于你独特情况的更多细节。要进一步扩展Cody所说的内容,请阅读此文。这会有用的。我删除了srand和rand,并提出了returnx*x+y*1103515245+12345%1000,因为我只需要1中的值-1000@user315684当前位置我说这句话并不是为了引起大家对我的答案的注意,而是为了供大家参考。但是你所做的基本上是实现一个哈希函数。@BenjaminLindley你当然完全正确。但是通过这种方式,我可以避免使用std::hash,并将代码移动到OpenCl中,这使得我的模拟速度更快。我从来没有提到过这一点,所以在大多数情况下,你的解决方案要漂亮得多。-1这太可怕了,你会在整个程序和你调用的任何库中干扰rand的其他使用,使用boost::hash,X和Y的散列的xor就可以了,C++11或其他数千种现成的实现中的任何一种。@user315684为什么这是公认的答案?你甚至不这样使用它?添加像这样的链接[链接文本]http://........com: 这样就不会那么随机了。但这是一个解决方案。我认为对于相同的输入值,你必须得到相同的输出,正如你在示例中所说的。柏林噪声产生伪随机数,而不完全是随机数。但是在使用柏林时,您可以控制输出的方式。主要的问题是,它在我不关心的值之间插值,但我本可以随机生成并删除符号。所以这个链接的等式是可行的。返回1.0-x*x*x*15731+789221+1376312589和7fffffff/1073741824.0;散列一个int不只是返回相同的int类型转换给unsigned吗?如此有效地,你在计算x+y。@FredOverflow:如果它真的这样做了,那将是一个非常糟糕的散列算法,所以不,不太可能。你自己试试看,告诉我你的结果。结果是:@BenjaminLindley And。如果要将32位散列为32位,则使用除identity函数以外的任何函数都是毫无意义的。在我看来,std::hash通过简单地返回其输入来做正确的事情。
int generateSortOfRandomInt(int X, int Y)
{
return (X * 0xcafebabe) ^ (Y * 0xdeadbeef);
}