public BodyDeposits(GeneratorConfiguration resource, ConfigNode node) { if (node == null) { node = new ConfigNode(); } this.deposits = new List<Deposit>(); this.seed = Misc.Parse(node.GetValue("Seed"), seedGenerator.Next()); var random = new System.Random(seed); for (int i = 0; i < resource.DepositCount; i++) { float R = random.Range(resource.MinRadius, resource.MaxRadius); for (int j = 0; j < resource.NumberOfTries; j++) { Vector2 Pos = new Vector2(random.Range(R, 360 - R), random.Range(R, 180 - R)); var deposit = Deposit.Generate(Pos, R, random, resource); if (!deposits.Any(d => d.Shape.Vertices.Any(v => deposit.Shape.PointInPolygon(new Vector2(v.x, v.y)))) && !deposit.Shape.Vertices.Any(v => deposits.Any(d => d.Shape.PointInPolygon(new Vector2(v.x, v.y))))) { deposits.Add(deposit); break; } } } var depositValues = node.GetValues("Deposit"); for (int i = 0; i < Math.Min(deposits.Count, depositValues.Length); i++) { deposits[i].Quantity = Misc.Parse(depositValues[i], deposits[i].InitialQuantity); } MaxQuantity = resource.MaxQuantity; }
public static Vector3 onUnitSphere(this System.Random gen) { float lon = gen.Range(0, 2.0f * Mathf.PI); float lat = gen.Range(-Mathf.PI, Mathf.PI); float c = Mathf.Cos(lat); return(new Vector3(c * Mathf.Cos(lon), Mathf.Sin(lat), c * Mathf.Sin(lon))); }
public override void GetTransform(PropSocket socket, DungeonModel model, Matrix4x4 propTransform, System.Random random, out Vector3 outPosition, out Quaternion outRotation, out Vector3 outScale) { base.GetTransform(socket, model, propTransform, random, out outPosition, out outRotation, out outScale); var rx = random.Range(-maxAngle, maxAngle); var ry = random.Range(-maxAngle, maxAngle); var rz = random.Range(-maxAngle, maxAngle); outRotation = Quaternion.Euler(rx, ry, rz); }
public override void GetTransform(PropSocket socket, DungeonModel model, Matrix4x4 propTransform, System.Random random, out Vector3 outPosition, out Quaternion outRotation, out Vector3 outScale) { var halfWidth = tileWidth / 2.0f; outPosition = new Vector3( random.Range(-halfWidth, halfWidth), 0, random.Range(-halfWidth, halfWidth)); outRotation = Quaternion.Euler(0, random.Range(0, 360), 0); outScale = Vector3.one; }
public BodyDeposits(GeneratorConfiguration resource, ConfigNode node) { if (node == null) { node = new ConfigNode(); } this.deposits = new List <Deposit>(); this.seed = Misc.Parse(node.GetValue("Seed"), seedGenerator.Next()); var random = new System.Random(seed); for (int i = 0; i < resource.DepositCount; i++) { float R = random.Range(resource.MinRadius, resource.MaxRadius); for (int j = 0; j < resource.NumberOfTries; j++) { Vector2 Pos = new Vector2(random.Range(R, 360 - R), random.Range(R, 180 - R)); var deposit = Deposit.Generate(Pos, R, random, resource); if (!deposits.Any(d => d.Shape.Vertices.Any(v => deposit.Shape.PointInPolygon(new Vector2(v.x, v.y)))) && !deposit.Shape.Vertices.Any(v => deposits.Any(d => d.Shape.PointInPolygon(new Vector2(v.x, v.y))))) { deposits.Add(deposit); break; } } } if (resource.CanReplenish) { // generated separately to allow updating older saves without messing with their deposites due to changes in the RNG sequence. for (int i = 0; i < deposits.Count; i++) { // MinHalfLife and MaxHalfLife are specified in hours double halflife = 3600 * random.Range(resource.MinHalfLife, resource.MaxHalfLife); deposits[i].Lambda = Math.Log(2) / halflife; } } var depositValues = node.GetValues("Deposit"); for (int i = 0; i < Math.Min(deposits.Count, depositValues.Length); i++) { var split = depositValues[i].Split(new [] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries); deposits[i].Quantity = Misc.Parse(split[0], deposits[i].InitialQuantity); if (split.Length >= 2 && resource.CanReplenish) { deposits[i].LastUT = Misc.Parse(split[1], deposits[i].LastUT); } } MaxQuantity = resource.MaxQuantity; CanReplenish = resource.CanReplenish; }
IEnumerator Start() { yield return(new WaitForSeconds(0.1f)); switchTimer = rndGen.Range(minTime, maxTime); if (startBehaviour) { current = startBehaviour; current.enabled = true; current.Restart(rndGen.Next(), switchTimer * 0.75f); } }
public override void GetTransform(PropSocket socket, DungeonModel model, Matrix4x4 propTransform, System.Random random, out Vector3 outPosition, out Quaternion outRotation, out Vector3 outScale) { base.GetTransform(socket, model, propTransform, random, out outPosition, out outRotation, out outScale); var angle = random.Range(0.0f, Mathf.PI * 2); var rotation = Quaternion.Euler(0, angle, 0); outRotation = rotation; float cellSize = 20; float halfCellSize = cellSize / 2.0f; outPosition.x = random.Range(-halfCellSize, halfCellSize); outPosition.z = random.Range(-halfCellSize, halfCellSize); }
private static Vector2[] GenerateStarSystemsPositions(Int32 count, Single multiplier) { Assert.IsTrue(count > 4); var positions = new Vector2[count]; Int32 horizontalCount = (Int32)Mathf.Sqrt(count); for (Int32 i = 0; i < count; i++) { // ReSharper disable once PossibleLossOfFraction positions[i] = new Vector2(i % horizontalCount, i / horizontalCount); for (Int32 rndOffsetCount = 2; rndOffsetCount <= 6; rndOffsetCount++) { positions[i] += new Vector2(Random.Range(-1f, 1f), Random.Range(-0.6f, 0.6f)) / rndOffsetCount; } } Single minX = positions.Select(p => p.x).Min(); Single minY = positions.Select(p => p.y).Min(); Single deltaX = minX < 0 ? -minX : 0; Single deltaY = minY < 0 ? -minY : 0; for (Int32 i = 0; i < positions.Length; i++) { positions[i] += new Vector2(deltaX, deltaY); positions[i] *= multiplier; } return(positions); }
void MakeRandom(int seed) { var psoRender = randomPreset.GetComponent <PSORender>(); var rnd = new System.Random(seed); randomPreset.seed = (int)DateTime.UtcNow.Ticks; int p = rnd.Range(0, 100); if (p < 50) { randomPreset.problem = PSOConfig.Problem.PerlinLandscape; randomPreset.perlinOctaves = rnd.Range(4, 10); randomPreset.perlinAmplitude = rnd.Range(15.0f, 25.0f); randomPreset.perlinFrequency.x = rnd.Range(0.02f, 0.1f); randomPreset.perlinFrequency.y = randomPreset.perlinFrequency.x * rnd.Gaussian(1.0f, 0.1f); randomPreset.perlinAmplitudePerOctave = rnd.Gaussian(0.5f, 0.1f); randomPreset.perlinFrequencyPerOctave = rnd.Gaussian(2.0f, 0.5f); randomPreset.perlinOffset.x = rnd.Range(-1000.0f, 1000.0f); randomPreset.perlinOffset.y = rnd.Range(-1000.0f, 1000.0f); psoRender.materialOverride = materialsLandscape[rnd.Range(0, materialsLandscape.Length)]; psoRender.yScale = 1.0f; } else { if (p < 75) { randomPreset.problem = PSOConfig.Problem.ImageSaturation; } else { randomPreset.problem = PSOConfig.Problem.ImageValue; } randomPreset.image = images[rnd.Range(0, images.Length)]; randomPreset.invertImage = true; psoRender.yScale = -rnd.Gaussian(20.0f, 4.0f); psoRender.materialOverride = materialsImage[rnd.Range(0, materialsImage.Length)]; } psoRender.fogOfFunction = (rnd.Range(0, 100) < 50); }
public override void GetTransform(PropSocket socket, DungeonModel model, Matrix4x4 propTransform, System.Random random, out Vector3 outPosition, out Quaternion outRotation, out Vector3 outScale) { base.GetTransform(socket, model, propTransform, random, out outPosition, out outRotation, out outScale); var angle = random.Range(0, 1) * 90; var rotation = Quaternion.Euler(0, angle, 0); outRotation = rotation; }
public static Deposit Generate(Vector2 Pos, float radius, System.Random random, ResourceDefinition resource) { var initialQuantity = random.Range(resource.MinQuantity, resource.MaxQuantity); var vertices = new List<Vector2>(); int vertexCount = random.Next(resource.MinVertices, resource.MaxVertices); for (int i = 0; i < vertexCount; i++) { float randomRadius = random.Range(resource.RadiusVariance * radius, radius); float angle = 2.0f * (float)Math.PI * ((float)i / (float)vertexCount); float x = Pos.x + randomRadius * (float)Math.Cos(angle); float z = Pos.y - randomRadius * (float)Math.Sin(angle); vertices.Add(new Vector2(x, z)); } var Shape = new Polygon(vertices.ToArray()); return new Deposit(Shape, initialQuantity, initialQuantity); }
public static void Shuffle <T>(T[] Array, System.Random Random) { int Count = Array.Length; for (int i = 0; i < Count; i++) { int j = Random.Range(0, Count - 1); T Temp = Array[i]; Array[i] = Array[j]; Array[j] = Temp; } }
/// <summary> /// 根据权重列表随机一个对应的项 /// </summary> /// <param name="weightList"></param> /// <returns></returns> public static int RandomIndexByWeight(int[] weightList, System.Random random) { if (weightList.Length == 1) { return(0); } int totalWeight = 0; for (int i = 0; i < weightList.Length; i++) { if (weightList[i] < 0) { return(i); } else { totalWeight += weightList[i]; } } int seek = random.Range(1, totalWeight); int head = 0; for (int i = 0; i < weightList.Length; i++) { if (seek > head && seek <= head + weightList[i]) { if (weightList[i] == 0) { if (i == 0) { continue; } else { return(i - 1); } } else { return(i); } } else { head += weightList[i]; } } return(-1); }
private static PlanetData GeneratePlanet(StarData starData, Single metallicity, Int32 num) { String name = "PLANET" + num; Single orbitRadius = Mathf.Sqrt(num + 1) * 50e9f + Random.Range(-3e9f, 3e9f); //Корень добавлен для создания эффекта протопланетарного диска с уплотнением в середине var orbitDegree = new TimeSpan(Random.Next(30, 320), 0, 0, 0); Single rotationSpeed = Random.Range(-0.7f, -0.2f); Single albedo = Random.Range(0.05f, 0.7f); //Статистика по sol из этой статьи подсказывает: https://ru.wikipedia.org/wiki/%D0%90%D0%BB%D1%8C%D0%B1%D0%B5%D0%B4%D0%BE Single temperature = starData.SurfaceTemperature * Mathf.Pow(1.0f - albedo, 0.25f) * Mathf.Sqrt(starData.Radius / orbitRadius * 2f); PlanetType type; Single mass; Boolean solid = Random.Range(0f, 1f) < metallicity; //Твердая ли планета if (solid) { //Сгенерировать твердую планету mass = Random.Range(0.1f, 10f) * Constants.EarthMass; if (temperature > 213.0f && temperature <= 340.0f) { type = PlanetType.Terra; } else { type = PlanetType.Desert; } } else { //Сгенерировать газ. гигант mass = Random.Range(10f, 1000f) * Constants.EarthMass; type = PlanetType.Gas; } var planetData = new PlanetData { LocationID = starData.LocationID, ParentStarID = starData.ID, Name = name, Mass = mass, OrbitRadius = orbitRadius, OrbitDegree = orbitDegree, RotationSpeed = rotationSpeed, Type = type, Temperature = temperature }; return(planetData); }
void Start() { var rndGen1 = new System.Random(seed1); var rndGen2 = new System.Random(seed2); for (int i = 0; i < 10; i++) { int r1 = rndGen1.Range(0, 100); Debug.Log("R1=" + r1); int r2 = rndGen2.Range(0, 100); Debug.Log("R2=" + r2); } }
private List <Deposit> generate(CelestialBody body, ResourceDefinition resource) { var random = new System.Random(depositSeed ^ (resource.Resource == "Kethane" ? bodySeeds[body.name] : 0) ^ resource.SeedModifier); var deposits = new List <Deposit>(); for (int i = 0; i < resource.DepositCount; i++) { float R = random.Range(resource.MinRadius, resource.MaxRadius); for (int j = 0; j < resource.NumberOfTries; j++) { Vector2 Pos = new Vector2(random.Range(R, 360 - R), random.Range(R, 180 - R)); var deposit = Deposit.Generate(Pos, R, random, resource); if (!deposits.Any(d => d.Shape.Vertices.Any(v => deposit.Shape.PointInPolygon(new Vector2(v.x, v.y)))) && !deposit.Shape.Vertices.Any(v => deposits.Any(d => d.Shape.PointInPolygon(new Vector2(v.x, v.y))))) { deposits.Add(deposit); break; } } } return(deposits); }
public BodyDeposits(GeneratorConfiguration resource, ConfigNode node) { if (node == null) { node = new ConfigNode(); } this.deposits = new List <Deposit>(); this.seed = Misc.Parse(node.GetValue("Seed"), seedGenerator.Next()); var random = new System.Random(seed); for (int i = 0; i < resource.DepositCount; i++) { float R = random.Range(resource.MinRadius, resource.MaxRadius); for (int j = 0; j < resource.NumberOfTries; j++) { Vector2 Pos = new Vector2(random.Range(R, 360 - R), random.Range(R, 180 - R)); var deposit = Deposit.Generate(Pos, R, random, resource); if (!deposits.Any(d => d.Shape.Vertices.Any(v => deposit.Shape.PointInPolygon(new Vector2(v.x, v.y)))) && !deposit.Shape.Vertices.Any(v => deposits.Any(d => d.Shape.PointInPolygon(new Vector2(v.x, v.y))))) { deposits.Add(deposit); break; } } } var depositValues = node.GetValues("Deposit"); for (int i = 0; i < Math.Min(deposits.Count, depositValues.Length); i++) { deposits[i].Quantity = Misc.Parse(depositValues[i], deposits[i].InitialQuantity); } MaxQuantity = resource.MaxQuantity; }
private static StarData GenerateStar(StarSystemData starSystemData) { //Пока генерируем только главную последовательность Single mass = Mathf.Pow(Random.Range(0.54f, 1.3f), 2f) * Constants.SolMass; var type = StarType.Yellow; Single surfaceTemp = -1f; { if (mass >= 0.3 * Constants.SolMass && mass <= 0.8 * Constants.SolMass) //M, красный карлик { type = StarType.Red; surfaceTemp = Random.Range(2000f, 5000f); } else if (mass > 0.8 * Constants.SolMass && mass <= 1.7 * Constants.SolMass) //Типа солнца { type = StarType.Yellow; surfaceTemp = Random.Range(3500f, 7500f); } else if (mass > 1.7 * Constants.SolMass && mass <= 18 * Constants.SolMass) //Белая или полуголубая звезда { type = StarType.White; surfaceTemp = Random.Range(6000f, 30000f); } else if (mass > 18 * Constants.SolMass) //Почти гигант, голубая звезда { type = StarType.Blue; surfaceTemp = Random.Range(10000f, 60000f); } } String name = type + " starData"; Single luminosity = Mathf.Pow(mass / Constants.SolMass, 3.9f) * Constants.SolLuminosity; Single radius = Mathf.Sqrt(luminosity) * Constants.SolRadius * (Constants.SolTemperature * Constants.SolTemperature) / (surfaceTemp * surfaceTemp * Mathf.Sqrt(Constants.SolLuminosity)); //L=(R^2)*(T^4) return(new StarData { LocationID = starSystemData.ID, Mass = mass, Name = name, Type = type, Radius = radius, SurfaceTemperature = surfaceTemp, Luminosity = luminosity }); }
/// <summary> /// 在数组中随机一个元素 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="list"></param> /// <returns></returns> public static T GetRandomInList <T>(List <T> list, System.Random random) { if (list != null && list.Count > 0) { if (list.Count == 1) { return(list[0]); } else { return(list[random.Range(0, list.Count)]); } } else { return(default(T)); } }
/// <summary> /// 获取随机的结果 /// </summary> /// <param name="rate"></param> /// <returns></returns> public static bool GetRating(float rate, System.Random random = null) { if (rate >= 1) { return(true); } else { float seek = 0f; if (random != null) { seek = random.Range(0f, -1f); } else { seek = UnityEngine.Random.Range(0f, 1f); } rate = rate > 0 ? rate : -rate; return(rate >= seek); } }
protected override void FillTexture(Color[] colors) { var rnd = new System.Random(seed); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { int index = y * width + x; float r; if (gaussian) { r = Mathf.Clamp01(rnd.Gaussian(mean, stdDev / 0.3f)); } else { r = rnd.Range(0.0f, 1.0f); } colors[index] = new Color(r, r, r, 1); } } }
private static List<Deposit> generate(CelestialBody body, int seed, ResourceDefinition resource) { var random = new System.Random(depositSeed ^ (resource.Resource == "Kethane" ? bodySeeds[body.name] : 0) ^ resource.SeedModifier); var deposits = new List<Deposit>(); for (int i = 0; i < resource.DepositCount; i++) { float R = random.Range(resource.MinRadius, resource.MaxRadius); for (int j = 0; j < resource.NumberOfTries; j++) { Vector2 Pos = new Vector2(random.Range(R, 360 - R), random.Range(R, 180 - R)); var deposit = Deposit.Generate(Pos, R, random, resource); if (!deposits.Any(d => d.Shape.Vertices.Any(v => deposit.Shape.PointInPolygon(new Vector2(v.x, v.y)))) && !deposit.Shape.Vertices.Any(v => deposits.Any(d => d.Shape.PointInPolygon(new Vector2(v.x, v.y))))) { deposits.Add(deposit); break; } } } return deposits; }
private static List <SpaceObjectData> GeneratePlanetsSystem(StarData starData) { Single deltaMass = Random.Range(0.004f, 0.04f) * Constants.SolMass; Single metallicity = Random.Range(0.5f, 0.9f); //Масса тяжелых элементов (тяжелее гелия) в % от общей массы var planets = new List <PlanetData>(); //Это начальный вариант системы, много планет будет удалено в ходе эволюции var asteroidFields = new List <AsteroidFieldData>(); for (Int32 i = 0; i < MaxPlanetCount && deltaMass > 0; i++) { planets.Add(GeneratePlanet(starData, metallicity, i)); } for (Int32 iterator = 0; iterator < EvolutionIterationsCount; iterator++) //Эволюция в три приема { for (Int32 i = 0; i < planets.Count - 1; i++) //Идем парами по орбитам { if (i < 0) { continue; } //Т.к. мы работаем со списком, то можем удалять элементы, но не забываем уменьшать значение итератора var planet1 = planets[i]; var planet2 = planets[i + 1]; if (!(Mathf.Abs(planet1.OrbitRadius - planet2.OrbitRadius) < EvolutionRange)) { continue; } Single ratio = planet1.Mass / planet2.Mass; if (ratio < 0.1f) { if (Random.Range(0, 2) == 1) { planet2.Mass += planet1.Mass * Random.Range(0f, 1f); //Вторая ест первую planet2.RingsMass = 0.01f * planet1.Mass; //Будем подбирать } planets.Remove(planet1); i--; } if (ratio <= 10f && ratio >= 0.1f) //Взаимно поделились на ноль { if (Random.Range(0, 2) == 1 && planet1.Type != PlanetType.Gas && planet2.Type != PlanetType.Gas) { var asteroidField = new AsteroidFieldData { LocationID = starData.LocationID, ParentStarID = starData.ID, Mass = planet1.Mass + planet2.Mass, Radius = (planet1.OrbitRadius + planet2.OrbitRadius) / 2, Name = "AstFieldFrom(" + planet1.Name + ")(" + planet2.Name + ")" }; asteroidFields.Add(asteroidField); } planets.Remove(planet1); planets.Remove(planet2); i -= 2; } if (ratio > 10) { if (Random.Range(0, 2) == 1) { planet1.Mass += planet2.Mass * Random.Range(0f, 1f); //Первая ест вторую planet1.RingsMass = 0.01f * planet2.Mass; } planets.Remove(planet2); i--; } } } for (Int32 i = 0; i < asteroidFields.Count - 1; i++) { if (Mathf.Abs(asteroidFields[i].Radius - asteroidFields[i + 1].Radius) > AsteroidBeltMergeRange) { continue; } asteroidFields[i].Radius = (asteroidFields[i].Radius + asteroidFields[i + 1].Radius) / 2; asteroidFields[i].Mass += asteroidFields[i + 1].Mass; var removingAsteroidField = asteroidFields[i + 1]; asteroidFields.Remove(removingAsteroidField); i--; } var resultList = new List <SpaceObjectData>(); resultList.AddRange(planets.ConvertAll(p => (SpaceObjectData)p)); resultList.AddRange(asteroidFields.ConvertAll(a => (SpaceObjectData)a)); return(resultList); }
public static float Range(this System.Random random, float min, float max) { return((float)random.Range((double)min, max)); }
/// <summary> /// 获取随机数,不包括max最大值 /// </summary> /// <param name="min"></param> /// <param name="max"></param> /// <returns></returns> public static int GetRandom(int min, int max, System.Random random) { return(random.Range(min, max - 1)); }
/// <summary> /// 指定した範囲内のランダムな浮動小数点数を返します。 /// </summary> /// <param name="min">返される乱数の包括的下限値。</param> /// <param name="max">返される乱数の包括的上限値。</param> public static float Range(this Original.Random random, float min, float max) { return((float)random.Range((double)min, (double)max)); }
public static float GetRandom(float min, float max, System.Random random) { return(random.Range(min, max)); }
public float GetValue(System.Random random) { return(random.Range(min, max)); }
override public bool Restart(int seed, float estimatedTime) { int tries = 0; int maxTries = 25; rndGen = new System.Random(seed); while (tries < maxTries) { elapsedTime = 0; PSORender psoRender = FindObjectOfType <PSORender>(); startLookPos = new Vector3(rndGen.Range(-1, 1), rndGen.Range(0.5f, 1.5f), rndGen.Range(-1, 1)).normalized *outerRadius *scale; startLookPos.y = Mathf.Max(startLookPos.y, psoRender.extentsY.y); PSOParticle particle = null; switch (targetParticle) { case TargetParticle.None: targetPos = rndGen.onUnitSphere() * innerRadius * scale; if (targetPos.y < 0) { targetPos.y = Mathf.Abs(targetPos.y); } break; case TargetParticle.Best: particle = psoRender.GetBestParticle(); break; case TargetParticle.Worst: particle = psoRender.GetBestParticle(); break; case TargetParticle.Random: int index = rndGen.Range(0, psoRender.GetParticleCount()); particle = psoRender.GetParticle(index); break; default: break; } transform.position = startLookPos; if (particle) { if (usePrediction) { targetPos = particle.Predict(estimatedTime); } else { particleTransform = particle.transform; targetPos = particleTransform.position; } Vector3 toTarget = targetPos - startLookPos; Vector3 dir = toTarget.normalized; float maxDist = toTarget.magnitude; if (dir.y < -0.1f) { // Check raycast if (!Physics.Raycast(startLookPos, dir, maxDist)) { break; } } tries++; } else { Vector3 toTarget = targetPos - startLookPos; Vector3 dir = toTarget.normalized; float maxDist = toTarget.magnitude; if (dir.y < -0.1f) { break; } } } if (tries == maxTries) { return(false); } FixedUpdate(); return(true); }