根据确定性和非确定性函数的 MSDN SQL BOL(联机丛书)页面,可以" 以确定的方式 " 使用非确定性函数
以下函数并不总是确定性的,但可以在确定性方式指定时在计算列的索引视图或索引中使用.
非确定性函数的含义可以以确定的方式使用吗?
有人可以说明如何做到这一点?并在那里你会怎么做呢?
sql sql-server deterministic user-defined-functions non-deterministic
已经阅读过这个问题,我有理由确定使用具有相同输入的浮点算术的给定进程(在相同的硬件上,使用相同的编译器编译)应该是确定性的.我正在研究一个不成立的案例,并试图确定可能导致这种情况的原因.
我已经编译了一个可执行文件,我正在为它提供完全相同的数据,在一台机器上运行(非多线程)但是我得到的错误约为3.814697265625e-06,经过仔细的谷歌搜索,我发现实际上等于1/4 ^ 9 = 1/2 ^ 18 = 1/262144.这非常接近32位浮点数的精度等级(根据维基百科大约7位数)
我怀疑它与已应用于代码的优化有关.我正在使用英特尔C++编译器并将浮点数推测转为快速而非安全或严格.这会使浮点过程不确定吗?是否存在可能导致此行为的其他优化措施?
编辑:根据Pax的建议,我重新编译了浮点投机的代码转向安全,我现在得到稳定的结果.这让我可以澄清这个问题 - 浮点推测实际上做了什么以及如何在应用于完全相同的输入时,导致相同的二进制(即一次编译,多次运行)产生不同的结果?
@Ben我正在使用英特尔(R)C++ 11.0.061 [IA-32]进行编译,而我正在运行英特尔四核处理器.
我正在考虑用C++编写多用户RTS游戏(部分)的可行性.我很快发现,一个硬性要求是游戏模拟必须对服务器和所有客户端的最后一点完全确定,以便能够将网络通信限制为用户输入,而不是游戏状态本身.由于每个人都有不同的计算机,这似乎是一个难题.
那么,是否有一些"神奇"的方法让C++编译器创建一个可在Linux(服务器),Windows和Mac上完全确定的可执行文件?我认为两个主要的OSS C++编译器是GCC和Clang,所以我想知道在这方面一个是否比另一个表现更好.
我也对任何可用于验证C++确定性的测试套件感兴趣.
[编辑]通过确定性,我的意思是编译的程序,给定相同的初始状态,并以相同的顺序输入,将始终在其运行的任何平台上产生相同的输出.所以,也是整个网络.一致的声音对我来说是对这种行为的恰当定义,但我不是母语人士,所以我可能会误解其确切含义.
[编辑#2]虽然关于确定性/一致性是否重要,以及我是否应该在游戏引擎中实现这一目标的讨论,以及它在C++中通常存在多大问题,但是它非常有趣,它实际上并没有真正回答题.到目前为止,没有人告诉我是否应该使用Clang或GCC来获得最可靠/确定/一致的结果.
[编辑#3]我刚想到有一种方法可以在Java中获得与C++完全相同的结果.必须采用JVM的开源实现,并提取实现运算符和数学函数的代码.然后将其转换为独立库并在其中调用可内联函数,而不是直接使用运算符.手动完成会很痛苦,但如果生成代码,那么这是一个完美的解决方案.也许这甚至可以通过类和运算符重载来完成,所以它看起来也很自然.
我对这些东西真的很新,所以我为这里的noobishness道歉.
构建一个Deterministic Finite Automaton识别以下语言的DFA:
L= { w : w has at least two a's and an odd number of b's}.
Run Code Online (Sandbox Code Playgroud)
每个部分的自动化(at least 2 a's, odd # of b's)很容易单独制作......任何人都可以解释一种系统的方式将它们合二为一吗?谢谢.
下面的代码(计算余弦相似度),在我的计算机上重复运行时,将输出1.0,0.9999999999999998或1.0000000000000002.当我取出normalize函数时,它只返回1.0.我认为浮点运算应该是确定性的.如果每次在同一台计算机上对相同的数据应用相同的操作,我的程序会导致什么?是否可能与堆栈中的哪个位置调用normalize函数有关?我怎么能阻止这个?
#! /usr/bin/env python3
import math
def normalize(vector):
sum = 0
for key in vector.keys():
sum += vector[key]**2
sum = math.sqrt(sum)
for key in vector.keys():
vector[key] = vector[key]/sum
return vector
dict1 = normalize({"a":3, "b":4, "c":42})
dict2 = dict1
n_grams = list(list(dict1.keys()) + list(dict2.keys()))
numerator = 0
denom1 = 0
denom2 = 0
for n_gram in n_grams:
numerator += dict1[n_gram] * dict2[n_gram]
denom1 += dict1[n_gram]**2
denom2 += dict2[n_gram]**2
print(numerator/(math.sqrt(denom1)*math.sqrt(denom2)))
Run Code Online (Sandbox Code Playgroud) 这是否可以以确定的方式运行多线程Java应用程序?我的意思是在我的应用程序的两个不同运行中始终使用相同的线程切换.
原因是在每次运行中以完全相同的条件运行模拟.
类似的情况是当使用随机数生成器获得总是相同的"随机"序列时,给出一些任意种子.
鉴于:

我不知道接受的语言是什么.
从它看,你可以得到几个最终结果:
1.) bb
2.) ab(a,b)
3.) bbab(a, b)
4.) bbaaa
Run Code Online (Sandbox Code Playgroud) 我有一个包含 GB 变量的图和一个随机函数(例如 VAE)。我希望能够运行一个函数,并且始终使用相同的随机序列(例如,输入大量的 x,并且始终获得完全相同的 z 和 y)。
我可以使用随机种子来实现这一点,这样每次从头开始运行脚本(即初始化会话)时我总是得到相同的序列。不过,我希望能够在不破坏会话的情况下重置随机序列,这样我就可以一遍又一遍地调用我的函数(并获得相同的序列)。销毁并重新初始化会话并不是很理想,因为我丢失了 GB 的变量,并且每次重新加载都是浪费。再次设置随机种子(tf.set_random_seed)似乎没有影响(我认为来自 tf.set_random_seed 的种子以某种方式与操作种子结合并在创建时烘焙到操作中?)
有没有办法解决?
我已经阅读了有关张量流中随机种子的文档和大量帖子(例如TensorFlow:将种子重置为常量值不会产生重复结果,Tensorflow `set_random_seed` 不起作用,TensorFlow:不可重复结果,如何获得Tensorflow 中可重现的结果,如何使用 TensorFlow 获得稳定的结果,设置随机种子)但是我无法得到我想要的行为。
例如玩具代码
import tensorflow as tf
tf.set_random_seed(0)
a = tf.random_uniform([1], seed=1)
def foo(s, a, msg):
with s.as_default(): print msg, a.eval(), a.eval(), a.eval(), a.eval()
s = tf.Session()
foo(s, a, 'run1 (first session):')
# resetting seed does not reset sequence. is there anything else I can do?
tf.set_random_seed(0)
foo(s, a, 'run2 …Run Code Online (Sandbox Code Playgroud) 我正在使用 mt19937 从给定种子生成随机字符串,如下所示:
std::string StringUtils::randstring(size_t length, uint64_t seed) {
static auto& chrs = "abcdefghijklmnopqrstuvwxyz";
thread_local static std::mt19937 rg(seed);
thread_local static std::uniform_int_distribution<std::string::size_type> pick(0, sizeof(chrs) - 2);
std::string s;
s.reserve(length);
while(length--) {
s += chrs[pick(rg)];
}
return s;
}
Run Code Online (Sandbox Code Playgroud)
我想保证随机数序列(以及生成的随机字符串)在同一架构的不同机器上是相同的,根据这个问题的答案应该是这样的。
但是,当我重建二进制文件(不更改任何依赖项或库)时,同一种子的随机数序列会发生变化(与使用相同种子的先前构建生成的序列相比)。
如何从同一机器架构+映像(x86_64 Linux)上不同二进制文件的给定种子生成有保证的随机数序列?
我们如何使用助记词列表作为种子(就像我们已经习惯使用加密货币钱包一样),以便能够在私钥丢失、意外删除或卡在损坏的设备上时恢复私钥?
这对于客户端之间的 e2e 加密很有用:密钥应该在客户端上生成,只有公钥会与服务器共享。
用户可以在需要时离线重新生成密钥,只要他们能够再次提供助记词,显然可以安全地离线存储。
助记词种子应该足够长,以提供安全量的熵。
一些问答似乎非常过时:我们如何在 Javascript/Typescript 中实现这一点,可能使用维护的库?
javascript rsa deterministic encryption-asymmetric typescript
deterministic ×10
c++ ×3
python ×2
random ×2
automata ×1
grammar ×1
intel ×1
java ×1
javascript ×1
rsa ×1
sql ×1
sql-server ×1
tensorflow ×1
typescript ×1