inohilog

/var/log/inohiro.log

かだいのこーど

問題文が意味不明だったけど、とりあえず書いた。
無駄にClassとか宣言しちゃって、いらないメモリを使ってる。

[0,4]区間の乱数を200個つくって、一番近い格子点を求めて、行列で統計を表示

今回はちゃんとSeedを設定しました*1

using System;

namespace SimPysics3
{
	public class dPoint
	{
		public dPoint( double x, double y ) { this.x = x; this.y = y; }
		public double x { get; set; }
		public double y { get; set; }
	}

	public class iPoint
	{
		public iPoint( int x, int y ) { this.x = x; this.y = y; } 
		public int x { get; set; }
		public int y { get; set; }
	}

	class MainClass
	{
		private static dPoint[] Calc()
		{
			const int RANDOM_MAX = 21478643;
			double x, y;
			dPoint[] points = new dPoint[200];
			const int Seed = 503;

			Random rand = new Random( Seed );
			int i = 0;

			while ( true )
			{
				x = ( double )( 1.0 / ( RANDOM_MAX + 1.0 ) * rand.Next( 0, 400000000 ) );
				y = ( double )( 1.0 / ( RANDOM_MAX + 1.0 ) * rand.Next( 0, 400000000 ) );
				if ( ( 0.0 <= x ) && ( x <= 4.0 ) )
				{
					if ( ( 0.0 <= y ) && ( y <= 4.0 ) )
					{
						points[i] = new dPoint( x, y );
						i++;
						if ( i == 200 ) break;
					}
				}
			}
			return points;
		}

		private static int ToNearest( double value )
		{
			double upper = Math.Abs( ( ( int )value ) + 1 - value );
			double lower = Math.Abs( ( ( int )value ) - value );

			int val = 0;

			if ( upper > lower )
			{
				val = Math.Abs( ( int )value );
			}
			else if ( upper < lower )
			{
				val = Math.Abs( ( int )value + 1 );
			}
			else
			{
				val = ( int )value;
			}
			return val;
		}

		private static iPoint[] GetNearestPoint( dPoint[] dPoints )
		{
			iPoint[] iPoints = new iPoint[dPoints.Length];

			iPoint neo;
			for ( int i = 0; i < dPoints.Length; i++ )
			{
				neo =
				 new iPoint( ToNearest( dPoints[i].x ), ToNearest( dPoints[i].y ) );
				iPoints[i] = neo;
			}

			return iPoints;
		}

		private static int[,] ToMatrix( iPoint[] iPoints )
		{
			int[,] Koushi = new int[5, 5];
			for ( int i = 0; i < 5; i++ )
				for ( int j = 0; j < 5; j++ )
					Koushi[i, j] = 0;

			for ( int i = 0; i < iPoints.Length; i++ )
				Koushi[iPoints[i].x, iPoints[i].y]++;

			return Koushi;
		}

		public static void Main( string[] args )
		{
			dPoint[] dPoints = Calc();
			iPoint[] iPoints = GetNearestPoint( dPoints );
			int[,] matrix = ToMatrix( iPoints );

			for ( int i = 0; i < 5; i++ )
			{
				for ( int j = 0; j < 5; j++ )
				{
					Console.Write( 
						string.Format( 
							"{0}\t", 
							matrix[j, i].ToString() 
						) 
					);
				}
				Console.WriteLine();
			}
			Console.ReadKey();
		}
	}
}

実行結果

3       4       4       2       2
6       13      10      11      10
6       15      11      13      11
7       6       17      18      2
2       6       9       9       3

*1:前回Seedを設定しなかったのはマイナス1点でした