如何洗牌整数集合,使输出在C++;Java呢? 我正在从C++到java移植一段代码。在C++中,我把一个向量 >如下: std::vector<int> integers(10); //Size is not constant and can change. std::iota(std::begin(std::begin(integers), std::end(integers), 0); //fills the vector with integers from 0 to 9 std::mt19937 gen; gen.seed(integers.size()); std::shuffle(std::begin(integers), std::end(integers), gen); std::向量整数(10)//大小不是恒定的,可以改变。 std::iota(std::begin(std::begin(整数),std::end(整数),0);//用0到9的整数填充向量 标准:mt19937 gen; gen.seed(integers.size()); std::shuffle(std::begin(整数)、std::end(整数)、gen);

如何洗牌整数集合,使输出在C++;Java呢? 我正在从C++到java移植一段代码。在C++中,我把一个向量 >如下: std::vector<int> integers(10); //Size is not constant and can change. std::iota(std::begin(std::begin(integers), std::end(integers), 0); //fills the vector with integers from 0 to 9 std::mt19937 gen; gen.seed(integers.size()); std::shuffle(std::begin(integers), std::end(integers), gen); std::向量整数(10)//大小不是恒定的,可以改变。 std::iota(std::begin(std::begin(整数),std::end(整数),0);//用0到9的整数填充向量 标准:mt19937 gen; gen.seed(integers.size()); std::shuffle(std::begin(整数)、std::end(整数)、gen);,java,c++,c++11,visual-c++,random,Java,C++,C++11,Visual C++,Random,在做了一些研究之后,我发现java使用线性同余生成器(LCG)来生成随机数。 为了使用Java.util.random为LCG使用的相同参数,我将随机数生成器引擎更改为(根据此wikepedia页面): std::线性同余引擎(10); C++洗牌结果:6,9,0,3,8,4,1,2,7,5 以下是相应的Java代码: ArrayList<Integer> array = new ArrayList(10); for(int i = 0; i < 10; ++i){

在做了一些研究之后,我发现java使用线性同余生成器(LCG)来生成随机数。 为了使用Java.util.random为LCG使用的相同参数,我将随机数生成器引擎更改为(根据此wikepedia页面):

std::线性同余引擎(10);
C++洗牌结果:6,9,0,3,8,4,1,2,7,5

以下是相应的Java代码:

ArrayList<Integer> array = new ArrayList(10);
for(int i = 0; i < 10; ++i){
    array.add(i, i);
}
Collections.shuffle(array,  new Random(10));
for(int i = 0; i < 10; ++i){
    System.out.print(array.get(i));
}
ArrayList数组=新的ArrayList(10);
对于(int i=0;i<10;++i){
数组。添加(i,i);
}
洗牌(数组,新随机数(10));
对于(int i=0;i<10;++i){
System.out.print(array.get(i));
}
Java洗牌结果:9,7,8,0,1,4,5,2,6,3

<> LI>有没有办法使C++ STADADD随机数发生器 与Java的行为相同,还是相反
  • 有没有其他(可能更简单的)方法可以解决 这个问题?我不介意更改我现有的C++代码。

  • 根据,线性同余生成器具有多个变量(模数、乘法器、增量)在不同的实现中,<>强> >,对于java和C++,使用链接可以看出,它们的差别很大。因此,即使你把它们都相同地播种,它们也会产生不同的值。因此,代码中没有改变C++和java版本同时产生相同的RANDO的方法。m数字序列


    如果您想要一个特定的随机序列,您最好的选择可能是找到一个支持这两种语言的第三方RNG库,但是StackOverflow不赞成建议使用外部库,所以祝您好运;)

    编写JNI代码即可。。C++代码看起来像:

    JNIEXPORT jintArray JNICALL Java_NativeRandom_generateRandomIntegers(JNIEnv *env, jclass cls, int size)
    {
        std::vector<int> integers(size);
        std::iota(std::begin(integers), std::end(integers), 0);
    
        std::mt19937 gen;
        gen.seed(size);
        std::shuffle(std::begin(integers), std::end(integers), gen);
    
    
        jintArray result = env->NewIntArray(size);
        if (result)
        {
            env->SetIntArrayRegion(result, 0, size, &integers[0]);
            return result;
        }
        return nullptr;
    }
    
    public class NativeRandom {
    
        static {
            System.loadLibrary("NativeRandom.so");
        }
    
        public static native int[] generateRandomIntegers(int size);
    
        public static void main(String[] args) {
            int[] randomNumbers = generateRandomIntegers(10);
            System.out.println(randomNumbers);
        }
    };
    

    如果您想要一个随机顺序,那么使用JNI进行操作的结果肯定会有所不同。让C++侧或java端生成数字并通过JNI传递给彼此。真正的问题是,如果它是随机的,为什么它应该是相同的?@Brandon,因为他们有相同的种子。@EJoshuaS最后,有人发现这个问题是合法的。我想人们只是读了问题的标题,然后马上投票否决它。很抱歉这么说,SO上的人越来越不体谅人了。至少他们应该给出否决的理由,这可能有助于人们以正确的方式提出问题。我同意——我认为否决的选民没有仔细阅读,但如果你不得不用多种语言工作的话,知道怎么做会非常有用。我可能要澄清的唯一一点(我认为仔细阅读已经很清楚了,但可能需要进一步强调)是,伪随机数生成器应该有相同的结果,因为它们有相同的种子。因此不反对建议使用外部库。因此,对于要求外部资源的问题和答案,只要提供一个外部链接就可以了,这是不赞成的。
    public class NativeRandom {
    
        static {
            System.loadLibrary("NativeRandom.so");
        }
    
        public static native int[] generateRandomIntegers(int size);
    
        public static void main(String[] args) {
            int[] randomNumbers = generateRandomIntegers(10);
            System.out.println(randomNumbers);
        }
    };