所有线程共享相同的"全局随机数生成器",还是每个线程都有自己的?
如果共享一个,我如何确保线程安全?在Real World Haskell的"Monads"一章中描述的使用getStdGen和setStdGen的方法看起来并不安全.
如果每个线程都有一个独立的发生器,那么快速连续启动的两个线程的发生器会有不同的种子吗?(例如,如果种子是以秒为单位的时间,它们将不会,但毫秒可能没问题.我不知道如何从Data.Time获得毫秒分辨率的时间.)
在C#中,我可以为类型为T的泛型数组定义一个扩展方法,如下所示:
public static T GetOrDefault<T>(this T[] arr, int n)
{
if (arr.Length > n)
{
return arr[n];
}
return default(T);
}
Run Code Online (Sandbox Code Playgroud)
但对于我的生活,我无法弄清楚如何在F#中做同样的事情!我试过了type 'a array with,type array<'a> with并且type 'a[] with编译器对它们中的任何一个都不满意.
任何人都可以告诉我在F#中做到这一点的权利是什么?
当然,我可以通过掩盖阵列模块并为此轻松添加功能来实现这一点,但我真的想知道如何将其作为扩展方法!
问题是要找到第n个加泰罗尼亚数模m,其中m是不是素数,m = (10^14 + 7).以下是我尝试过的方法列表:(最大N = 10,000)
ncr(2*n, n)/(n + 1),再次由于ncr函数不够快,不能加速使用取幂平方因为m不是素数.Catalans,但由于文件大小限制而失败.C(i,k) = C(i-1,k-1) + C(i-1,k),这太慢了所以我想知道还有其他更快的算法来找到我不知道的第n个加泰罗尼亚数字吗?
使用动态编程
void generate_catalan_numbers() {
catalan[1] = 1;
for (int i = 2; i <= MAX_NUMBERS; i++) {
for (int j = 1; j <= i - 1; j++) {
catalan[i] = (catalan[i] + ((catalan[j]) * …Run Code Online (Sandbox Code Playgroud) 根据F#的规格(见§6.5.7),for循环简单的通过整数界(int又名int32又名System.Int32)的限制start和stop,如
for i = start to stop do
// do sth.
Run Code Online (Sandbox Code Playgroud)
我想知道为什么要求这种类型的for循环的迭代界限int32.为什么不允许uint32?int64?bigint?
我知道序列迭代表达式(for ... in ...)可以迭代任意序列; 然而,这需要分配一个迭代器和调用MoveNext,Current什么不是,因此可能比普通循环效率低得多(增量计数器,比较,条件跳转).为避免这种情况,您将无法使用while和手动递增循环计数器......
奇怪的是,如果表达式包含在序列表达式中,F#确实允许非int32循环边界for,例如
seq { for i = 0I to 10I do
printfn "%A" i }
Run Code Online (Sandbox Code Playgroud)
所以,我想问题是:是否有一个特殊的原因只允许int32循环?为什么这个限制不适用于表达式中包含的for循环seq?
我正在使用BinarySerializer,它有一个非常大的(尽管不是很深)项目图.我有8GB的ram支持12Gig的交换,并且在序列化时我得到一个OutOfMemoryException,这是预期的(图表可能接近或超过2Gb).
然而,当我使用gcAllowVeryLargeObjects它并不是更好,我仍然得到相同的异常,我肯定在应该保留在内存中的东西(至少与交换).
有什么我可以做的来支持序列化这个/一种方法来获得相同的功能集,但可能会得到结果?
我的序列化代码没有什么特别之处:
public static byte[] Serialize(this object o)
{
var ms = new MemoryStream();
var bf = new BinaryFormatter();
bf.Serialize(ms, o);
ms.Position = 0;
return ms.ToArray();
}
Run Code Online (Sandbox Code Playgroud)
我正在序列化的对象包含自身包含数组等的项目数组,但完整的图形本身并不"大"(这是索引数据的结果,在源处,已经只有大约1GB的大小).
这不是由于GC碎片造成的(压缩大堆没有帮助).
有没有办法告诉Bazel什么时候可以使用多少CPU内核?
我在VMware Workstation上构建TensorFlow并且作为虚拟机我可以调整虚拟机的处理器和核心数量.
在构建TensorFlow的过程中,我发现只使用一个核心工作.当我给Workstation提供四个内核并构建TensorFlow时,它最终将系统停止到我必须重启的程度.
如果我等了几个小时(不管它一夜之间),它有时会返回以下错误:
gcc:内部编译器错误:已杀死(程序cc1plus)
虽然我可以使用虚拟机配置选项更改内核数量,但我更愿意这样做,而无需关闭并重新启动虚拟机.
我想查找列表列表中是否存在给定元素.如果元素存在于某处是第一个列表列表,我只会变为真.
有什么建议?
memberlist(X,[[X|T1]|T2]).
memberlist(X,[[H|T1]|T2]) :-
memberlist(X,[T1|T2]).
Run Code Online (Sandbox Code Playgroud) 我已经设法让xUnit处理我的小样本组件.现在我想知道我是否也可以参加FsCheck.我的问题是,在为我的函数定义测试属性时,我很难过.
也许我只是没有一套好的样本函数,但是这些函数的测试属性是什么呢?
//transforms [1;2;3;4] into [(1,2);(3,4)]
pairs : 'a list -> ('a * 'a) list //'
//splits list into list of lists when predicate returns
// true for adjacent elements
splitOn : ('a -> 'a -> bool) -> 'a list -> 'a list list
//returns true if snd is bigger
sndBigger : ('a * 'a) -> bool (requires comparison)
Run Code Online (Sandbox Code Playgroud) 我刚刚了解到OCAML必须有一个.用于执行浮点运算的后缀.一个例子是3. +. 4.equals 7.(float).但是,F#以相同的方式处理浮点和整数运算,因此3 + 4(int)和3. + 4.(float)都有效.
F#+自然分配给int,因此let add a b = a + b属于类型int -> int -> int.确实(+)给了我val it : (int -> int -> int) = <fun:it@6-1>.
这导致了以下序列,我认为这非常违反直觉:
> 3. + 4.;;
val it : float = 7.0
> (+);;
val it : (int -> int -> int) = <fun:it@8-2>
Run Code Online (Sandbox Code Playgroud)
所以我的问题是: "重载"是否由编译器中的特殊机制/案例完成,或者这是一个语言范围的事情所以我可能可以定义一个名为add(或其他任何)的函数,它具有一个整数和一个定义浮子(或任何其他类型).
我能够运行Deep MNIST Example正常,但运行时fully_connected_feed.py,我收到以下错误:
File "fully_connected_feed.py", line 19, in <module>
from tensorflow.g3doc.tutorials.mnist import input_data ImportError: No module named
g3doc.tutorials.mnist
Run Code Online (Sandbox Code Playgroud)
我是Python的新手,所以也可能只是一个常规设置问题.