我正在尝试为游戏创建基于百分比的概率.例如,如果某个项目的爆击几率为45%,则必须表示其中的45次命中率至关重要.
首先,我尝试使用一个简单的解决方案:
R = new Random();
int C = R.Next(1, 101);
if (C <= ProbabilityPercent) DoSomething()
Run Code Online (Sandbox Code Playgroud)
但是在100次迭代中,例如有48%的可能性,它在100分中给出40-52.同样适用于49,50,51.因此,这些"百分比"之间没有区别.
问题是如何设置例如50的百分比,并严格地随机获得50的100? 对于罕见项目查找的概率而言,有机会增加查找项目的机会是非常重要的.所以1%的buff会很敏感,因为现在不是.
对不起,我的英语不好.
我实现了下面的RandomDate,但我总是让值关闭到"从"日期,我可能会错过这里的东西....
public static DateTime GetRandomDate(DateTime from, DateTime to)
{
var range = new TimeSpan(to.Ticks - from.Ticks);
var rnd = new Random();
var randTimeSpan = new TimeSpan((long)(range.TotalSeconds - rnd.Next(0, (int)range.TotalSeconds)));
return from + randTimeSpan;
}
Run Code Online (Sandbox Code Playgroud) 我来自PHP和Javascript的Wild Wild West,您可以从函数返回任何内容.虽然我不喜欢缺乏问责制,但我在努力保持代码"完美"方面也遇到了新的挑战.
我制作了这个通用函数来从列表中选择一个随机元素
public static T PickRandom<T>(this IList<T> list) {
Random random = new Random();
int rnd = random.Next(list.Count);
return list[rnd];
}
Run Code Online (Sandbox Code Playgroud)
但我想保护自己不要在0值列表中使用它.显然我不能从T以外的函数返回任何东西,例如false或-1.我当然可以这样做
if(myList.Count > 0)
foo = Utilites.PickRandom(myList);
Run Code Online (Sandbox Code Playgroud)
然而,在C#中有很多疯狂的事情我不知道,对于这个应用程序,我正在创建我非常,经常必须从列表中选择一个可以在其Count中不断递减的随机元素.有没有更好的办法?
我需要创建一个独特的块来测试我正在处理的不同项目.
所以我创建了一个简单的程序来生成一个X长度的随机字符串.
问题是,如果我调用它一次,我得到一个随机字符串,如果我再次调用它(例如在for循环中)我得到相同的字符串用于循环的整个执行.
我有一种感觉,它被缓存或者其他东西,但我不知道.net做到了这一点,我只是在这一点上感到困惑.
调用代码:
StreamWriter SW = new StreamWriter("c:\\test.txt");
int x = 100;
while (x >0)
{
SW.WriteLine(RandomString(20));
x--;
}
Run Code Online (Sandbox Code Playgroud)
这是方法:
private static string RandomString(int Length)
{
StringBuilder sb = new StringBuilder();
Random randomNumber = new Random();
for (int i = 0; i <= Length; ++i)
{
int x = randomNumber.Next(65, 122);
sb.Append(Convert.ToChar(x));
}
return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
"VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
..................
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB"
Run Code Online (Sandbox Code Playgroud)
那么是什么让我觉得Random.next()会一直返回一个新的随机数?
如何生成不同的数字,它生成相同的数字
Random rand = new Random(100000);
rand.Next();
Run Code Online (Sandbox Code Playgroud) 我使用Random来生成一个随机数序列.我只构造一次随机对象,然后在循环内生成随机值(其中300个).问题是,一旦我获得了所有的值并对它们进行了排序,我就会发现它们中的一些是相同的和/或顺序的:我生成的数字从0到50000.
这是我的脚本:
Random rnd = new Random();
for (int n=0; n < 300; n++)
{
int RndNumber = rnd.Next(0, 50000);
System.Threading.Thread.Sleep(3);
}
Run Code Online (Sandbox Code Playgroud)
有人可以知道为什么会发生这种情况,我该如何改进它以使其更随机?
可能重复:
随机数生成器仅生成一个随机数
不久前我对此感到有些困惑.我有以下代码:
public blockType generateRandomBlock()
{
Random random = new Random();
int makeBlockOfType = random.Next(0, 100);
blockType t = blockType.normal;
if (makeBlockOfType <= 80 && makeBlockOfType >= 60)
{
t = blockType.blue;
}
else if (makeBlockOfType > 80 && makeBlockOfType <= 95)
{
t = blockType.orange;
}
else if (makeBlockOfType > 95 && makeBlockOfType <= 100)
{
t = blockType.green;
}
return t;
}
Run Code Online (Sandbox Code Playgroud)
相当简单,它enum根据随机生成的数字(基于系统时间)返回一个值.不幸的是,由于一些奇怪的原因,我有所有的块都是一种颜色或另一种颜色,即使这是针对每个被放入游戏的块运行.但是,当我使用调试器逐步执行此操作,然后在运行一段时间后查看结果时,我发现块现在根据提供的机会多色.我对为什么会发生这种情况感到有些困惑.
为此,我使用MonoGame,它使用Mono编译器而不是Microsoft编译器.这可能是问题吗?我试图将此代码内联到构造函数中,从中调用它但我得到的结果相同(我猜测编译器无论如何都会内联代码).
我试图单独重启Visual Studio而不是让运行进行构建; 没有变化.
任何建议和帮助非常感谢!
我正在开发第一个C#头实验室.我在程序中遇到了一个问题,那就是狗的速度相同.我无法弄清楚他们为什么会这样做,因为在我看来,每个对象实例都会在其X位置添加一个随机的1到5个像素.这种随机性应该足以产生差异.
所以,因为我不想发布我的整套实验室1类,我重新创建了一个小型独立版本,只有两只狗赛车,没有下注方面.
Form1.Designer包含: - 两个带有猎犬的图片框.-a开始按钮
Greyhound.cs类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
namespace test
{
public class Greyhound
{
public int DogID;
public PictureBox myPictureBox;
public Point StartingPosition;
public Point CurrentPosition;
public Random Randomizer;
public bool Run()
{
int AddDistance = Randomizer.Next(1, 7);
CurrentPosition.X += AddDistance;
myPictureBox.Location = CurrentPosition;
if (CurrentPosition.X > 600)
{
return true;
}
else
{
return false;
}
}
public void ReturnToStart()
{
CurrentPosition = StartingPosition;
myPictureBox.Location = StartingPosition;
} …Run Code Online (Sandbox Code Playgroud) 所以这是我一直在使用的代码.它只是一个简单的程序来测试3个随机生成的数字是按升序还是降序排列.出于某种原因,如果我使用调试器并踩到每一行,那么代码就能正常工作.如果没有,那么它表示数字是100%的顺序或100%的顺序,这不应该是这种情况.
这是我一直在使用的代码:
int num1;
int num2;
int num3;
int yes = 0;
int no = 0;
for (int i = 0; i <= 99; i++)
{
Random rnd = new Random();
num1 = rnd.Next(1, 11);
num2 = rnd.Next(1, 11);
num3 = rnd.Next(1, 11);
if ( ((num1 <= num2) && (num2 <= num3)) || ((num1 >= num2) && (num2 >= num3)) )
{
yes += 1;
}
else
{
no += 1;
}
}
Console.WriteLine("The Number are in ascending order " …Run Code Online (Sandbox Code Playgroud) 随机化列表我遇到了很多问题.我在谈论一个包含200个元素的列表,我希望将其列入清单.不要误会我的意思,我读了很多例子,乍一看有很好的东西,比如:
但根据我的经验,至少在快速机器上,这基本上是毫无价值的.改组运行得如此之快,以至于两次调用Random.NEXT()之间没有MS延迟,导致几乎不随机的行为.
我不是在谈论超级安全的东西,只是随机的基本游戏.我知道我可以添加1 MS的延迟,但这意味着"浪费"200 MS只是随机化一个列表.
现在我找到了这种方法:http://www.codinghorror.com/blog/2007/12/shuffling.html
看起来不错,使用GUID进行排序.但他们不是以同样的方式创造的吗?让我们提高一个档次,让我们假设我要创建1000个数字,介于0 - 5之间.这段代码基本没用:
var resultA = new List<int>();
for (int i = 0; i < 1000; i++)
{
resultA.Add(new Random().Next(5));
}
var resultB = new List<int>();
for (int i = 0; i < 1000; i++)
{
resultB.Add(new Random().Next(5));
Thread.Sleep(1);
}
Run Code Online (Sandbox Code Playgroud)
A根本不起作用,至少不是我在Windows Phone 7中的环境.B很好,但它需要一秒钟,这也是愚蠢的.任何评论或想法,创建随机的整数列表都不是那么难:-)
c# ×10
random ×6
.net ×2
asp.net-mvc ×1
char ×1
datetime ×1
generics ×1
mono ×1
monogame ×1
performance ×1
probability ×1
text ×1
timespan ×1
xna ×1