Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#列出抛硬币的可能性_C# - Fatal编程技术网

C#列出抛硬币的可能性

C#列出抛硬币的可能性,c#,C#,大家好。我正在学习编程,我正在尝试将一系列抛硬币的所有可能结果放入一个字符串列表中,而下面的代码适用于少量抛硬币(我很惊讶,在所有的“抛硬币”中,没有一个这样的例子有关堆栈溢出的问题已经存在。但是,我找不到合适的副本。您可能是第一个在掷硬币的特定上下文中发布有关此特定问题的问题的人 在评论中: 之后我需要处理这个列表,这就是为什么我要把它保存在一个列表中 这是行不通的。正如评论中指出的,要表示40枚硬币的所有可能组合,需要2^40个不同的序列。即使你很保守,一次存储5个字节的压缩数据结构,这仍然

大家好。我正在学习编程,我正在尝试将一系列抛硬币的所有可能结果放入一个字符串列表中,而下面的代码适用于少量抛硬币(我很惊讶,在所有的“抛硬币”中,没有一个这样的例子有关堆栈溢出的问题已经存在。但是,我找不到合适的副本。您可能是第一个在掷硬币的特定上下文中发布有关此特定问题的问题的人

在评论中:

之后我需要处理这个列表,这就是为什么我要把它保存在一个列表中

这是行不通的。正如评论中指出的,要表示40枚硬币的所有可能组合,需要2^40个不同的序列。即使你很保守,一次存储5个字节的压缩数据结构,这仍然是5个字节内存的2^40倍,即近5-1/2 TB。这就是te在技术上,在64位进程的限制范围内,但在Windows或运行Windows的典型计算机提供的功能方面,不在任何合理的实际限制范围内

此外,即使你能存储所有这些序列,也要花费大量的时间来做任何有用的事情。而且,没有人能够读得足够快来看到整个列表;假设他们读得非常快,每秒可以读10次,那仍然是17000年

也就是说,生成它们的基本逻辑非常简单,即使程序没有足够的时间完成。一种方法如下所示:

class Program
{
    const int flipCount = 40;
    const long counterMax = (long)1 << flipCount;

    static void Main(string[] args)
    {
        for (long flipSequence = 0; flipSequence < counterMax; flipSequence++)
        {
            DisplayFlips(flipSequence);
        }
    }

    private static readonly StringBuilder sb = new StringBuilder(flipCount);

    private static void DisplayFlips(long flipSequence)
    {
        sb.Clear();

        for (int i = 0; i < flipCount; i++)
        {
            sb.Append((flipSequence & 1) != 0 ? 'T' : 'H');
            flipSequence >>= 1;
        }

        Console.WriteLine(sb);
    }
}
类程序
{
常数int flipCount=40;
常量长计数器最大值=(长)1>=1;
}
(某人);
}
}

我很惊讶,在堆栈溢出的所有“投币”问题中,竟然没有一个这样的问题。但是,我找不到合适的副本。您可能是第一个在投币的特定上下文中发布有关此特定问题的问题的人

在评论中:

之后我需要处理这个列表,这就是为什么我要把它保存在一个列表中

这是行不通的。正如评论中指出的,要表示40枚硬币的所有可能组合,需要2^40个不同的序列。即使你很保守,一次存储5个字节的压缩数据结构,这仍然是5个字节内存的2^40倍,即近5-1/2 TB。这就是te在技术上,在64位进程的限制范围内,但在Windows或运行Windows的典型计算机提供的功能方面,不在任何合理的实际限制范围内

此外,即使你能存储所有这些序列,也要花费大量的时间来做任何有用的事情。而且,没有人能够读得足够快来看到整个列表;假设他们读得非常快,每秒可以读10次,那仍然是17000年

也就是说,生成它们的基本逻辑非常简单,即使程序没有足够的时间完成。一种方法如下所示:

class Program
{
    const int flipCount = 40;
    const long counterMax = (long)1 << flipCount;

    static void Main(string[] args)
    {
        for (long flipSequence = 0; flipSequence < counterMax; flipSequence++)
        {
            DisplayFlips(flipSequence);
        }
    }

    private static readonly StringBuilder sb = new StringBuilder(flipCount);

    private static void DisplayFlips(long flipSequence)
    {
        sb.Clear();

        for (int i = 0; i < flipCount; i++)
        {
            sb.Append((flipSequence & 1) != 0 ? 'T' : 'H');
            flipSequence >>= 1;
        }

        Console.WriteLine(sb);
    }
}
类程序
{
常数int flipCount=40;
常量长计数器最大值=(长)1>=1;
}
(某人);
}
}

我假设您是从控制台应用程序调用此功能?您不能将它们全部保存在内存中,40个硬币意味着2^40个可能的结果。如果您只是将它们全部存储为5字节(40位)值,这仍然是2^40*5字节的内存,即5TB。但是,您不需要存储它们,因为您处理的硬币只能有两种状态,您可以使用任何普通的40位数字,因此只需从0到2^40计算一个
long
,并将0转换为head,1转换为tail,就可以得到所有的组合。但是ll,您不能将它们全部保存在内存中。或者,如果您只是将找到的每个组合打印到控制台上。要扩展@Lasse的注释,请注意,您可以用40位信息表示所有2^40种可能性。64位整数(即
)因此,你的问题实际上分解为从0到2^40-1的迭代,并将整数转换为二进制,在这里你显示
H
T
,而不是
0
1
。当然,还有一个问题,你将在哪里找到一个耐心阅读所有2^40 com的用户二进制…但这是另一个问题。我假设你是从控制台应用程序调用它?你不能将它们全部保存在内存中,40个硬币意味着2^40个可能的结果。如果你只是将它们全部存储为5字节(40位)值,这仍然是2^40*5字节的内存,即5TB。但是,您不需要存储它们,因为您处理的硬币只能有两种状态,您可以使用任何普通的40位数字,因此只需从0到2^40计算一个
long
,并将0转换为head,1转换为tail,就可以得到所有的组合。但是ll,您不能将它们全部保存在内存中。或者,如果您只是将找到的每个组合打印到控制台上。要扩展@Lasse的注释,请注意,您可以用40位信息表示所有2^40种可能性。64位整数(即
)因此,你的问题实际上分解为从0到2^40-1的迭代,并将整数转换为二进制,在这里你显示
H
T
,而不是
0
1
。当然,还有一个问题,你将在哪里找到一个耐心阅读所有2^40 com的用户二进制…但这是另一个问题。