当前位置: 首页 > 知识库问答 >
问题:

兰德():怪异的行为

幸越泽
2023-03-14
#include <iostream>
#include <ctime>    
#include <cstdlib>  
#include <fstream>      
#include <algorithm> 
#include <array>

using namespace std;

//generate random integer between 0 and MAX
int randomn(int MAX);

int main()
{
    const int N = 10000;
    const int T = 100;     //Number of trials

    srand((unsigned)time(0));   

    ofstream writefile ("Observation.out");

    for (int indexT = 0; indexT < T; indexT++) {

        //initializing myArray
        array<bool, N> myArray;
        array<bool, N> newArray;

        auto middle = myArray.begin() + myArray.size() / 2;
        fill(myArray.begin(), middle, false);
        fill(middle, myArray.end(), true);

        int counterIt = 0;  //desired Iteration number

        for (;;) {
            int counterF = 0;
            int randompos = 0;
            bool savedata = true;

            //suffling myArray using Fisher–Yates shuffle
            for (int indexN = N-1; indexN > 0; indexN--) {
                randompos = randomn(indexN);
                savedata = myArray[randompos];
                myArray[randompos] = myArray[indexN] ;
                myArray[indexN] = savedata;
            }           
            //next Iteration
            for (int indexN = 0; indexN < N; indexN++) {
                randompos = randomn(N-1);
                savedata = myArray[randompos];
                newArray[indexN] = savedata;
                if (savedata == false){
                    counterF += 1;
                }
            }

            copy(begin(newArray), end(newArray), begin(myArray));

            //updating Iteration number
            counterIt += 1;

            if ((counterF == 0)|| (counterF == N)) {
                break;
            }

        }

        writefile << indexT+1 <<"\t"<<counterIt <<endl;
    }

    writefile.close();

    return 0;
}

int randomn (int MAX){
    int temp;
    for (;;){
        temp = rand();
        if ( temp < RAND_MAX - RAND_MAX%(MAX+1) ) 
            return temp%(MAX+1);
    }
}
1st run            2nd run
1  28278          1    13583  
2  7754           2    7308   
3  11308          3    22580  
4  5093           4    6307    ** oscillation starts
5  4952           5    42060   
6  5017           6    10485   
7  10400          7    8525    
8  6307   **      8    31061   
9  42060          9    6307   ** 1st period 
10  10485         10   42060  
11  8525          11   10485 
12  31061         12   8525   
13  6307   **     13   31061  
14  42060         14   6307   ** 2nd period 
15  10485         15   42060 

共有1个答案

夹谷英奕
2023-03-14

rand()不应用于任何严重的操作。它的质量可能很差。

例如,我用它做了一个模拟,我知道确切的答案。使用rand(),模拟收敛到一个与确切答案略有不同的数字。我用更好的东西替换了rand(),并且:

  • 模拟速度提高3倍
  • 模拟收敛到精确解。
uint64_t s[2]; // seed this

uint64_t next(void) {
    uint64_t s1 = s[0];
    const uint64_t s0 = s[1];
    const uint64_t result = s0 + s1;
    s[0] = s0;
    s1 ^= s1 << 23; // a
    s[1] = s1 ^ s0 ^ (s1 >> 18) ^ (s0 >> 5); // b, c
    return result; 
}
 类似资料:
  • 我观察到库函数,当它在循环中被调用一次时,它几乎总是产生正数。

  • 我正在设计一个网站,有一些h3标题和段落,包装在一个名为“featured-info”的div类中。此外,我还有一个footer元素,它位于主体中的主包装器中。各段用斜体字写成: 并且页脚有边框: 页脚文本也是一个h4向上感知: 主要的问题是我有一个设置:@media screen和(最小宽度:750px),它使一些导航按钮内联,并调整一些文本的大小,但是...当页面大小小于750px时,页脚样式

  • 问题内容: 我有这个非常简单的课程: 在类路径中指定的此上下文文件不存在。我几乎可以输入任何想要的名称,并且代码不会中断。我的意思是测试运行正常,就好像该文件确实存在。 如果我从: classpath 到 classpath* 做了一个小的更改,它会发出喙,表示该文件不存在,这也是我在第一种情况下的预期行为。 春季版本3.2.3。 有人可以解释这种奇怪的行为吗? 编辑 建议的日志内容: 我什至尝试

  • 问题内容: 为什么这样做有效: 但这不是: 如果我有一个数组实例变量,并且想在我的构造函数中对其进行初始化,那么我不必走 我觉得我在这里想念什么吗? 问题答案: 这里的构造在Java中称为数组初始化器。这是一个特殊的速记,仅在某些语法构造中可用: [JLS 10.6数组初始化器](http://java.sun.com/docs/books/jls/third_edition/html/array

  • 我正在将我的应用程序从angular2 RC5和angular WebPack脚手架迁移到angular 2 2.0.0和angular cli beta 14。 你知道吗? 更新: 第一个错误可能与https://github.com/angularclass/angular2-webpack-starter#frequence-askeds-questions(第二个问题)有关,我有几个问题需

  • 问题内容: 这个问题已经在这里有了答案 : 嵌套函数中的局部变量 (4个答案) 5年前关闭。 我在玩Python生成器和模块,并尝试制作无限版的Eratosthenes筛。这是我的代码: 当我对其进行测试时,我得到以下信息: 但是,如果我用这样的函数代替的重新分配: 我得到: 我不知道为什么第一个版本不起作用。据我所知,这两个版本应该等效。有谁知道为什么他们不一样? 问题答案: 在Python中使