1

このコードは、[0,1) の範囲で 50 個の乱数を生成します。

int main(){

int i,j,M=50;

// If the interval is not uniform
double interval_widths[3] = { 0.1, 0.11, 0.03};

double interval_widths_sum[3];


//Divide into subintervals
void Init() {
  interval_widths_sum[0] = 0;
  for (int i=1; i<N; i++) {
    interval_widths_sum[i] = interval_widths_sum[i-1] + interval_widths[i];
  }
}

//check in which interval R is
int Seek(double R) {
  int i;
  if (R < 0.0) return -1;
  for (i = 0; i < N; i++) {
    if (R >= interval_widths_sum[i]) {
        break;
    }
   return (i);
  }

}

  unsigned long init[4] = {0x123, 0x234, 0x345, 0x456}, length = 4;

  MTRand drand; 

  for (i = 0; i < M; i++) {

    double x=("%10.8f ", drand());
    double y=("%10.8f ", drand());
    double R=("%10.8f ", drand());
    cout<<"(x,y)="<< x <<","<< y<< endl;
    a[i]=x*y;
       double *p= &x;
    double *q= &y;
    double *r= &R;
    double z= Seek(*r);
    cout<<"(x,y)="<<*p<<","<<*q<<endl;
    cout<< Init<<" "<< z<<endl;
  }
}

1) [0,1] の範囲で x と y の値を生成します。x= 0.11, 0.23, ..... と y= 0.13, 0.33, ..... などとしましょう。

2) ここで a= x*y を定義します。a1= 0.11*0.13、a2 = 0.23*0.33 などのように。

3) ここで、間隔 [0,1] をサイズ [0,a1],[a1,a1+a2],......,[ai,1] の (3j-2) サブ間隔に分割したいと思います。 (i=1...3j-3)。

4) 次に、[0,1] の範囲内で数値 R を生成します。(3j-2) のどれにこの R が含まれているかを調べます。

4

1 に答える 1

2

[OP の目標の理解に苦しむ編集。願わくばもっと近くに。]

N 個の間隔 (ボックス) がありN=(3*j-2)ます。

j=1 の場合、(0,0) と (1,1) にコーナーがある 1 つのボックスがあります。

ランダムに ax,y が生成され、それぞれが 0.0 から 1.0 の範囲で生成されます

この x,y を指定して、N 個のボックスのどれにこの点が含まれているかを見つけます。既存の各ボックスを調べて、(x,y) が範囲内にあるかどうかを確認します。より高速な方法がありますが、これは出発点です。

この時点でこのボックスを分割し、さらに 3 つのボックスを作成します。

必要に応じて繰り返します

#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include <memory.h>

double drand() {
  return rand()/(1.0 + RAND_MAX);
}


typedef struct Box_s {
  double x0, y0, x1, y1;
} Box_t;

#define Box_N (303)
int Box_Count = 0;
Box_t Box[Box_N];

void Box_Init() {
  memset(Box, 0, sizeof(Box));
  Box[0].x0 = 0.0;
  Box[0].y0 = 0.0;
  Box[0].x1 = 1.0;
  Box[0].y1 = 1.0;
  Box_Count = 1;
}

int Box_Find(double x, double y) {
  for (int b=0; b<Box_Count; b++) {
    if ((Box[b].x0 <= x) && (x <= Box[b].x1) && (Box[b].y0 <= y) && (y <= Box[b].y1)) {
      return b;
    }
  }
  printf("Box not found %e %e\n", x, y);
  exit(1);
}

void Box_Divide(int b, double x, double y) {
  if ((Box[b].x0 <= x) && (x <= Box[b].x1) && (Box[b].y0 <= y) && (y <= Box[b].y1)) {
    // Make 3 more boxes
    if ((Box_Count + 3) >= Box_N) {
      printf("Not enough boxes\n");
      exit(1);
    }
    Box[Box_Count].x0 = x;
    Box[Box_Count].x1 = Box[b].x1;
    Box[Box_Count].y0 = Box[b].y0;
    Box[Box_Count].y1 = y;
    Box_Count++;
    Box[Box_Count].x0 = x;
    Box[Box_Count].x1 = Box[b].x1;
    Box[Box_Count].y0 = y;
    Box[Box_Count].y1 = Box[b].y1;
    Box_Count++;
    Box[Box_Count].x0 = Box[b].x0;
    Box[Box_Count].x1 = x;
    Box[Box_Count].y0 = y;
    Box[Box_Count].y1 = Box[b].y1;
    Box_Count++;
    // Update original box
    Box[b].x1 = x;
    Box[b].y1 = y;
    return;
  }
  printf("x y not in box %d %e %e\n", b, x, y);
  exit(1);
}


void Box_Print() {
  double TotalArea = 0.0;
  printf("\n");
  printf("%3s (%5s, %5s) ( %5s, %5s) %5s\n", "#", "x0", "y0", "x1", "y1", "Area");
  for (int b=0; b<Box_Count; b++) {
    double Area = (Box[b].x0 - Box[b].x1) * (Box[b].y0 - Box[b].y1);
    printf("%3d (%5.3f, %5.3f) ( %5.3f, %5.3f) %5.3f\n", b, Box[b].x0, Box[b].x1, Box[b].y0, Box[b].y1, Area);
    TotalArea += Area;
  }
  printf("%3d  %5s  %5s    %5s  %5s  %5.3f\n", Box_Count, "", "", "", "", TotalArea);
}

int main(int argc, char *argv[]) {
  Box_Init();
  for (int rcount = 0; rcount < 50; rcount++) {
    Box_Print();
    double x = drand();
    double y = drand();
    int b = Box_Find(x, y);
    Box_Divide(b, x, y);
  }
  Box_Print();
  return 0;
}
于 2013-06-08T18:39:01.643 に答える